我有2个对象Parent
和Child
与一对多的映射相关联。
现在我要删除Parent
的所有孩子。
我使用了以下代码但它没有任何效果。
//start tx
Parent p = getFromDb();
p.setChilds(null) ; explicitly setting to null so that childs get deleted
session.merge(p);
//commit tx
我的配置中有以下内容:
<set name="myChilds" inverse="true" lazy="false" cascade="all">
<key>
<column name="parentId" />
</key>
<one-to-many class="com.xyz.MyChild" />
</set>
没有任何例外,但孩子不会被删除。
答案 0 :(得分:1)
myChilds
集合被标记为从子节点到父节点的多对一的反向关联。这意味着Hibernate使用关联的另一端来确定关联是否存在。
因此,您应该将child.parent
设置为null
而不是归零(或清空,比清零更清晰)子集。
然而,这还不够。打破父母与子女之间的联系并不会杀死孩子。它只是让他们孤儿。如果要删除它们,则必须为每个孩子调用session.delete()
。
最后,合并在这里根本没用。合并的目标是将分离实体的状态复制到其附加版本。您的父实体已经附加。
你似乎错过了Hibernate reference documentation中非常好的解释的许多部分。再读一遍。
答案 1 :(得分:0)
我们需要查看更多的映射,明确地显示子映射。
我的理论是你的关系是双向的,所以你需要将每个子句中的父引用设置为null。
另一种可能是您将错误的设置设置为null,因为您的映射显示子集的名称为myChilds
,但您的setter只是setChilds
。如果您的setChilds
方法实际上设置了myChilds
属性,则情况并非如此......
答案 2 :(得分:0)
Hibernate为您的父实体关联一个子元素集合。如果设置为null,则此关系会被破坏但不会从db中物理删除子项。如果clean()
在父类中显示子元素的集合/列表/集,则可以解决此问题。如您所知,通过引用存储的列表中的对象以及清理呈现每个子元素的真实实体。