如何删除子记录而不是将外键设置为null

时间:2010-09-19 14:21:05

标签: java hibernate orm cascade

我有一个用户和一组一对多的权限:

User.hbm.xml:

<set name="authorities" table="authorities" cascade="all-delete-orphan">
    <key column="user_id" />
    <one-to-many class="com.ebisent.domain.Authority" />
</set>

当我删除用户时,我也想删除权限,但是发生的事情是子表的外键(authorities.user_id)被设置为null。然后我收到以下错误并回滚用户删除:

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

但是,不会回滚authority.user_id更新为null。

删除父用户时,如何删除权限?

编辑: 我通过明确删除权限,在用户上调用refresh(),然后删除用户来完成此工作,但我想知道“正确”的方法。

1 个答案:

答案 0 :(得分:1)

这很奇怪,级联all-delete-orphan应该将delete操作从父级级联到子级。因此,以下内容足以让孩子们被删除:

Parent p = (Parent) session.load(Parent.class, pid);
session.delete(p);
session.flush();

使用all,delete-orphan或更简单delete(您不应该)时,您会得到不同的结果吗?关联是双向的吗?如果是,你能展示对方和相应的映射吗?

  

关联只是从父到子,我得到的结果与all,delete-orphan和delete相同,但是...我没有session.flush(),这似乎解决了问题

显式刷新可能有所帮助。但它不应该是必要的。我认为将外键定义为非可空将有助于获得正确的行为:

<set name="authorities" table="authorities" cascade="all-delete-orphan">
    <key column="user_id" not-null="true"/>
    <one-to-many class="com.ebisent.domain.Authority" />
</set>

虽未经过测试。