Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Oracle在Hibernate中插入多对一行时出现问题_Java_Oracle_Hibernate_Hibernate Mapping - Fatal编程技术网

Java 使用Oracle在Hibernate中插入多对一行时出现问题

Java 使用Oracle在Hibernate中插入多对一行时出现问题,java,oracle,hibernate,hibernate-mapping,Java,Oracle,Hibernate,Hibernate Mapping,我在使用Hibernate 4.3.5将父记录和关联的子记录插入Oracle 11g数据库时遇到问题。我有一个记录类,它包含一组图像对象 记录类映射: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> &l

我在使用Hibernate 4.3.5将父记录和关联的子记录插入Oracle 11g数据库时遇到问题。我有一个记录类,它包含一组图像对象

记录类映射:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.wts.service.model.Record" table="RECORDS">
        <id name="recordId" type="long">
            <column name="REC_ID" precision="10" scale="0"/>
            <generator class="sequence"><param name="sequence">RECORDS_SEQ</param></generator>
        </id>
        ...
        <set name="images" inverse="true" cascade="all">
            <key column="IMG_REC_ID"/>
            <one-to-many class="com.wts.service.model.Image"/>
        </set>
    </class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.wts.service.model.Image" table="IMAGES">
        <id name="imageId" type="long">
            <column name="IMG_ID" precision="10" scale="0"/>
            <generator class="sequence"><param name="sequence">IMAGES_SEQ</param></generator>
        </id>
        <many-to-one name="record" column="IMG_REC_ID" not-null="true"/>
    </class>
</hibernate-mapping>
我遵循了和许多不同的变体,但我无法让Hibernate将记录的主键插入到图像的外键列中!这是一个非常简单的关联(和常见的用例),所以我必须在这里做一些事情。有人知道我做错了什么吗

编辑:

我还尝试将密钥设置为NOTNULL,但得到了相同的错误:

<set name="images" inverse="true" cascade="all">
        <key column="IMG_REC_ID" not-null="true"/>
        <one-to-many class="com.wts.service.model.Image"/>
    </set>
以下是在
session.commit()之后运行的sql语句


它是一个双向多对一关联。 在记录类映射中,您将错误的列映射为键列

将IMG_REC_ID替换为REC_ID


注意:键列必须是相同的类主键ID。

看起来您已将图像实体添加到记录的图像集合中,而未将记录设置为此图像实体。像这样:

Image img = new Image();
Record rec = new Record();
rec.getImages().add(img);
// img.setRecord(rec);    Looks like this is missing in your code
session.save();
在这种情况下,在映像实体的持久性期间,hibernate尝试将null插入到不可为null的字段中

UPD

请向多对一元素添加class属性。并删除not null=“true”:


这不是Hibernate的问题,它是一个json反序列化的正常操作,当对象来自rest服务并与jackson反序列化时,只需将@JsonManagedReference anotation设置为父实体中的子属性,并将@JsonBackReference anotation设置为子实体中的父属性。就你而言:

公共类记录{
@JsonManagedReference
列出图像;
}
公众阶级形象{
@JsonBackReference
记录;
}

我用REC_ID替换了键列,但这不起作用(相同的错误)。IMG_REC_ID是图像表中的FK到记录表中的REC_ID PK。该键列不应该引用子表中的FK列吗?请尝试使用cascade=“all delete orphan”并在键中包含“not null”。请参见编辑2。图像已经与记录关联,因为记录对象来自REST web服务帖子。从提供的示例中,我看到只有图像实体与适当的记录实体关联。但反之亦然。每个实体的image.getRecord()中存储了什么?所以,问题似乎是我没有用图像设置记录!在一位同事提出建议后,我试过一次,但它导致了另一个错误,我没有仔细观察,认为这是同一个问题。看起来现在我必须弄清楚如何让JBoss的REST提供程序不进入一个无限循环序列化图像和记录!再次感谢!
<set name="images" inverse="false" cascade="all">
        <key column="IMG_REC_ID" not-null="true"/>
        <one-to-many class="com.wts.service.model.Image"/>
    </set>
public void createRecord(Record record) {
        //set the create bys for the images and actions
        record.setCreateDt(new Date());

        for (Image image : record.getImages()) {
            image.setCreateBy(record.getCreateBy());
            image.setCreateDt(record.getCreateDt());
        }
        for (Action action : record.getActions()) {
            action.setCreateBy(record.getCreateBy());
            action.setCreateDt(record.getCreateDt());
        }
        session.save(record);
    }
14:43:06,586 INFO  [stdout] (http--0.0.0.0-8080-1) Hibernate: select RECORDS_SEQ.nextval from dual
14:43:06,715 INFO  [stdout] (http--0.0.0.0-8080-1) Hibernate: select IMAGES_SEQ.nextval from dual
14:43:06,847 INFO  [stdout] (http--0.0.0.0-8080-1) Hibernate: insert into RECORDS (REC_EXT_ID, REC_GRP_ID, REC_APPL, REC_LATITUDE, REC_LONGITUDE, REC_PRIVATE, REC_LOCKED, REC_CREATE_BY, REC_CREATE_DT, REC_UPDATE_BY, REC_UPDATE_DT, REC_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
14:43:06,969 INFO  [stdout] (http--0.0.0.0-8080-1) Hibernate: insert into IMAGES (IMG_REC_ID, IMG_STATUS, IMG_CT_CD, IMG_FORMAT, IMG_WIDTH, IMG_HEIGHT, IMG_IMAGE, IMG_CREATE_BY, IMG_CREATE_DT, IMG_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
14:43:08,090 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--0.0.0.0-8080-1) SQL Error: 1400, SQLState: 23000
14:43:08,090 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http--0.0.0.0-8080-1) ORA-01400: cannot insert NULL into ("FOSUSER"."IMAGES"."IMG_REC_ID")
Image img = new Image();
Record rec = new Record();
rec.getImages().add(img);
// img.setRecord(rec);    Looks like this is missing in your code
session.save();
<many-to-one name="record" column="IMG_REC_ID" class="Record"/>