我正在使用具有一对一关系的Hibernate XML映射构建应用程序。我的实体是Auto和Targa。
这是我的Java类定义。
Targa.java
public class Targa {
private long id_targa;
private String stato;
private String codice;
...
Auto.java
public class Auto {
private long id_auto;
private String marca;
private String modello;
private int cilindrata;
private Targa targa;`
...
现在,我想在数据库中插入Auto和Targa(我正在使用MySQL)。 SQL表代码为:
CREATE TABLE targa (
id_targa BIGINT(20) NOT NULL,
stato VARCHAR(50) NOT NULL,
codice VARCHAR(50) NOT NULL,
PRIMARY KEY (id_targa)
)
CREATE TABLE auto (
id_auto BIGINT(20) NOT NULL,
marca VARCHAR(50) NOT NULL,
modello VARCHAR(50) NOT NULL,
cilindrata INT(11) NOT NULL,
targa BIGINT(20) NOT NULL,
PRIMARY KEY (id_auto),
FOREIGN KEY (targa) REFERENCES targa
)
因此,我创建了一个Java main(我没有插入setId属性,因为它是auto_increment):
Targa ta = new Targa();
ta.setStato("Italia");
ta.setCodice("FW156WF");
new TargaDAO().insertTarga(ta);
Auto au = new Auto();
au.setMarca("Alfa Romeo");
au.setModello("Giulia");
au.setCilindrata(2400);
au.setTarga(ta);
new AutoDAO().insertAuto(au);
DAO类使用session.saveOrUpdate()方法将对象保存在数据库中。
运行主代码时,我的Targa对象存储在数据库中,但是当我尝试存储Auto对象时,出现错误:
java.sql.BatchUpdateException:字段“ targa”没有默认值
有谁可以帮助我吗 ?我不明白为什么插入后我的表Auto中的列
targa
没有任何值。我的映射文件是:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="model.Auto" table="auto">
<id name="id_auto" column="id_auto">
<generator class="increment"/>
</id>
<property name="marca" column="marca"/>
<property name="modello" column="modello"/>
<property name="cilindrata" column="cilindrata"/>
<one-to-one name="targa" class="model.Targa" />
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="model.Targa" table="targa">
<id name="id_targa" column="id_targa">
<generator class="increment"/>
</id>
<property name="stato" column="stato"/>
<property name="codice" column="codice"/>
</class>
</hibernate-mapping>
最佳答案
您已设置au.setTarga(ta);
但ta没有id,因为此行
new TargaDAO().insertTarga(ta);
只保留一个对象。您需要检索持久性ID,并在以后的查询中使用它
例如:
em.persist(entity);
System.out.println(entity.getId());