【发布时间】:2013-12-28 08:33:15
【问题描述】:
我有一个一对多的关系如下 -
父 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(parent)。
sessionFactory.getCurrentSession().saveOrUpdate(parent);
当我插入一个新的父母时,它会很好地插入孩子。插入后,我将控件移回具有相同值的表单。然后,我更改了孩子的一些值并再次提交。在这种情况下,我可以(从休眠日志中)看到父级已更新,但更改后的子级未更新。
Hibernate 中是否有一个选项可以在父级更新时强制更改的子级进行更新?如果只有改变的孩子不能更新,我可以让所有的孩子都更新。
如果这些信息不足以理解我想要做什么,请告诉我,我会提供更多信息。
提前致谢
更新:-
我刚刚注意到 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 配置之外,它背后没有真正的代码。我已验证更改的数据在传递给操作的对象中。
-
你检查过hibernate触发的所有查询
-
是的,我查过了。 Hibernate 触发插入的所有查询。但是,在更新期间,只会触发更新父项的查询。
标签: java hibernate one-to-many