3

我有一个用户和一组处于一对多关系的权限:

用户.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

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

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

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

4

1 回答 1

1

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

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

使用时是否会得到不同的结果,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>

虽然没有测试。

于 2010-09-19T17:01:29.567 回答