我正在使用具有一对一关系的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());

08-07 14:48