使用persist对象中的新元素更新列表

时间:2015-05-26 12:03:31

标签: java hibernate persistence

我通过使用Hibernate并尝试在列表中添加子对象从数据库中获取了一个对象,但它显示未找到"父键"错误。这是我的Hibernate映射

<hibernate-mapping>
    <class name="com.demo.hibernate.Employee" table="EMPLOYEE">

        <id name="id" type="int" column="id">
            <generator class="increment" />
        </id>
        <property name="name" column="name" type="string"></property>
        <property name="edu" column="edu" type="string"></property>
        <list name="lstAddress" cascade="all">
            <key column="EMPLOYEE_ID" />
            <list-index column="id" />
            <one-to-many class="com.demo.hibernate.Address" />
        </list>
    </class>

    <class name="com.demo.hibernate.Address" table="ADDRESS">

        <id name="id" type="int" column="id">
            <generator class="assigned" />
        </id>
        <property name="city" column="city" type="string"></property>
        <property name="state" column="state" type="string"></property>
        <many-to-one name="objEmployee" column="employee_id" class="com.demo.hibernate.Address" />
    </class>
    </class>

</hibernate-mapping>

Java代码

Employee objEmployee = (Employee) session.get(Employee.class, 1);
Address objAdd = new Address();
objAdd.setId(200);
objAdd.setCity("Mumbai");
objAdd.setState("Maharashtra");
objAdd.setObjEmployee(objEmployee);
objEmployee.getLstAddress().add(objAdd);

session.saveOrUpdate(objEmployee);

这是我收到的例外

8180 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 2291, SQLState: 23000
8180 [main] ERROR org.hibernate.util.JDBCExceptionReporter - ORA-02291: integrity constraint (HIBERNATE_MAP.FKE66327D438D94246) violated - parent key not found

8180 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 2291, SQLState: 23000
8180 [main] ERROR org.hibernate.util.JDBCExceptionReporter - ORA-02291: integrity constraint (HIBERNATE_MAP.FKE66327D438D94246) violated - parent key not found

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
    at Main.main(Main.java:77)
Caused by: java.sql.BatchUpdateException: ORA-02291: integrity constraint (HIBERNATE_MAP.FKE66327D438D94246) violated - parent key not found

    at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459)
    at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:4133)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
    ... 8 more

我在做错配置吗?如果有人遇到这种问题,请告诉我。

1 个答案:

答案 0 :(得分:0)

试试这段代码:

Employee objEmployee = (Employee) session.get(Employee.class, 1);
Address objAdd = new Address();
objAdd.setId(200);
objAdd.setCity("Mumbai");
objAdd.setState("Maharashtra");
objAdd.setObjEmployee(objEmployee);
//objEmployee.getLstAddress().add(objAdd);
// save objAdd not objEmployee
session.saveOrUpdate(objAdd);