我有一个用户和一组一对多的权限:
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()
,然后删除用户来完成此工作,但我想知道“正确”的方法。
答案 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>
虽未经过测试。