我正在构建一个具有一对一关系的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()方法在DB中保存对象。
当我运行主代码时,我的Targa对象存储在数据库中,但是当我尝试存储我的Auto对象时,我有错误:
是的,有人能帮帮我吗?我不明白为什么我的表格中的java.sql.BatchUpdateException:字段'targa'没有默认值
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>
答案 0 :(得分:2)
您已设置au.setTarga(ta);
,但ta没有ID,因为此行
new TargaDAO().insertTarga(ta);
只保留ta对象。你需要检索持久化的id并在进一步的查询中使用它
例如:
em.persist(entity);
System.out.println(entity.getId());