java.sql.BatchUpdateException:字段'myFK'没有默认值

时间:2017-06-27 10:22:55

标签: java mysql hibernate

我正在构建一个具有一对一关系的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>

1 个答案:

答案 0 :(得分:2)

您已设置au.setTarga(ta);,但ta没有ID,因为此行

new TargaDAO().insertTarga(ta);

只保留ta对象。你需要检索持久化的id并在进一步的查询中使用它

例如:

em.persist(entity);
System.out.println(entity.getId());