使用parent.setChilds(null)显式删除子项

时间:2011-10-11 13:58:20

标签: java hibernate

我有2个对象ParentChild与一对多的映射相关联。

现在我要删除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>

没有任何例外,但孩子不会被删除。

3 个答案:

答案 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()在父类中显示子元素的集合/列表/集,则可以解决此问题。如您所知,通过引用存储的列表中的对象以及清理呈现每个子元素的真实实体。