Java 将删除孤立项与where条件相结合
Hibernate映射行为不明确和/或危险的问题。我有一个一对多关系,它有一个级联删除孤立条件和一个where条件来限制集合中的项。在此映射-Java 将删除孤立项与where条件相结合,java,hibernate,orm,data-mapping,Java,Hibernate,Orm,Data Mapping,Hibernate映射行为不明确和/或危险的问题。我有一个一对多关系,它有一个级联删除孤立条件和一个where条件来限制集合中的项。在此映射- <hibernate-mapping> <class name="User" table="user" > <!-- properties and id ... --> <set table="email" inverse="true" cascade="all,delete-orphan" w
<hibernate-mapping>
<class name="User" table="user" >
<!-- properties and id ... -->
<set table="email" inverse="true" cascade="all,delete-orphan" where="deleted!=true">
<key column="user_id">
<one-to-many class="Email"/>
</set>
</class>
</hibernate-mapping>
现在假设我有一个与一个或多个电子邮件对象关联的用户对象,其中至少有一个具有“true”值的deleted属性。在调用用户对象上的session.delete()时,将发生以下哪两种情况
一方面,场景1)忽略where条件,根据域模型,该条件可能不正确。但是在场景2中,如果父表被删除,并且子表(email)的join键上存在外键约束,那么delete命令将失败。发生了什么,为什么?这只是Hibernate的特性如何变得模棱两可的另一个例子吗?我没有测试映射,但在我看来,正确的(默认)行为应该是忽略
where
条件并删除所有子记录(这是删除父项时避免FK约束冲突的唯一选项)。从业务角度来看,这可能不“正确”,但另一个选项也不“正确”,因为它根本不起作用
总而言之,映射本身看起来不连贯。您应该not级联delete
操作(并手动处理子电子邮件的删除)
或者,我认为这可能是最正确的行为,您应该对用户
和相关的电子邮件
实施软删除。大概是这样的:
<hibernate-mapping>
<class name="User" table="user" where="deleted<>'1'">
<!-- properties and id ... -->
<set table="email" inverse="true" cascade="all,delete-orphan" where="deleted<>'1'">
<key column="user_id">
<one-to-many class="Email"/>
</set>
<sql-delete>UPDATE user SET deleted = '1' WHERE id = ?</sql-delete>
</class>
<class name="Email" table="email" where="deleted<>'1'">
<!-- properties and id ... -->
<sql-delete>UPDATE email SET deleted = '1' WHERE id = ?</sql-delete>
</class>
</hibernate-mapping>
更新用户集已删除='1',其中id=?
更新已删除的电子邮件集='1',其中id=?
这里要做的是:
- 我们使用
sqldelete
覆盖默认的delete,以更新标志,而不是真正的delete(软删除)
- 我们使用
where
过滤实体和关联,以仅获取未被软删除的实体
这一点的灵感来自于。不过还没有测试过
工具书类