我有如下一个一对多的关系 -Hibernate的一个一对多:在更新,改变了孩子不更新
父HBM: -
<hibernate-mapping>
<class name="ParentClass" table="PARENT_TABLE" schema="schemaname" lazy="false">
<cache usage="read-write" />
<id name="id" column="PARENT_ID_ID" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">schemaname.parent_sequence_name</param>
</generator>
</id>
<version name="versionNumber" column="version_num" type="java.lang.Long" insert="false" />
<property name="recordStatus" column="RECORD_STATUS" type="java.lang.String" insert="false" />
<list name="children" cascade="all-delete-orphan">
<key column="PARENT_ID" />
<list-index column="LINE_NUMBER" />
<one-to-many class="ChildClass" />
</list>
&audit;
</class>
</hibernate-mapping>
儿童HBM: -
<hibernate-mapping>
<class name="ChildClass" table="CHILD_TABLE" schema="schemaname" lazy="false">
<id name="id" column="CHILD_ID" type="java.lang.Long">
<generator class="native">
<param name="sequence">schema.child_sequence_name</param>
</generator>
</id>
<version name="versionNumber" column="VERSION_NUMBER" type="java.lang.Long" />
<property name="recordStatus" column="RECORD_STATUS" type="java.lang.String" />
<property name="lineNumber" column="LINE_NUMBER" type="java.lang.Long" />
<many-to-one name="parent" column="PARENT_ID" class="ParentClass" fetch="select" />
&audit;
</class>
</hibernate-mapping>
我正在使用Struts进入窗体中的父窗体和子窗体并进入动作类。动作类执行.saveOrUpdate(父)。
sessionFactory.getCurrentSession().saveOrUpdate(parent);
当我插入一个新的父项时,它插入子项很好。插入后,我将控件移回具有相同值的窗体。然后,我改变一些孩子的价值观并重新提交。在这种情况下,我可以看到(从休眠日志)父进程已更新,但更改后的子进程未更新。
Hibernate中是否有一个选项来强制更改父级更新时更改的子级?如果只有变化的孩子不能更新,我可以让所有的孩子都得到更新。
如果这些信息不足以理解我正在尝试做什么,请让我知道,我会提供更多信息。
在此先感谢
更新: -
我只注意到休眠抛出这个异常的子记录试图更新: -
Could not synchronize database state with session
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.efleets.services.billing.domain.InvoiceBulk#206]
at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1761)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2403)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2303)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2603)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:92)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at com.efleets.services.common.integration.GenericDAOImpl.flush(GenericDAOImpl.java:115)
感谢。任何帮助将不胜感激。
你可以在代码中为更新情况设置父数据和子数据吗? –
通过Struts2操作从表单中设置数据。除Struts2配置外,没有真正的代码。我已验证已更改的数据位于传入操作的对象中。 –
你有没有检查过所有的查询是否正在通过休眠被触发 –