【发布时间】:2013-12-13 06:34:03
【问题描述】:
如果集合的“父级”与 all-delete-orphan 映射,正确和简单的更新集合方法是什么?对象?
通过更新,我不仅仅指从集合中添加/删除项目,还包括更新项目属性的值(当然对于之前在集合中的那些项目)。
场景是有一个 Parent 对象,它有一个 Child 对象的集合,并且用户可以通过一种形式编辑 Children 集合 - 添加/删除孩子,但也可以编辑孩子的属性 (在同一表格上)。
基本上我想要这样的东西:
Parent parent = session.get(Parent.class, parentUI.getId());
parent.setChildren(parentUI.getChildren()); // parentUI is a DTO
session.saveOrUpdate(parent);
这不起作用,我理解原因,但在我看来,这应该是使用休眠和开发 UI 应用程序时非常常见的情况,所以我正在寻找一个(按书本)解决方案。
我使用的是 hibernate 3.6.10 和基于 XML 的配置。
这是相关的映射(我使用 ArrayList 来存储子集合):
<list name="children" cascade="all, delete-orphan">
<key column="parent_id" not-null="true"/>
<list-index column="ordinal" />
<one-to-many class="Child" />
</list>
如果重要的话,子对象也有以相同方式映射的集合,但我认为这不相关,因为这是一个与所描述的问题相同的问题。
顺便说一句。我为此浪费了一整天的时间,当然还检查了数十个与此非常相似的问题,但还没有找到合理的解决方案或解决此问题的模式。也许我错过了什么?
【问题讨论】:
-
尝试清除子列表,然后调用'setChildren'方法
-
parent.setChildren(parentUI.getChildren());如果要保存分离的对象,可以尝试 merge() 方法。这可能会删除现有值,请谨慎使用。
-
在当前会话中从数据库中提取数据并尝试更新同一会话上下文中的值时使用 saveOrUpdate。
-
@Zeus 不幸的是,但是我尝试(合并或 saveOrUpdate)我得到“org.hibernate.HibernateException:拥有的实体实例不再引用具有 cascade="all-delete-orphan" 的集合: “。对此我确实理解它发生的原因,
-
@Dav Blanked that won't work - NonUniqueObjectException 被抛出,因为在更新现有子项的情况下,可能有两个具有相同标识的实例 - 一个从 DB 加载,一个从 UI 加载(它不'是否先清理集合无关紧要 - 子对象仍绑定到 Hibernate 会话)
标签: hibernate spring-mvc orm mapping all-delete-orphan