Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将删除孤立项与where条件相结合_Java_Hibernate_Orm_Data Mapping - Fatal编程技术网

Java 将删除孤立项与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映射行为不明确和/或危险的问题。我有一个一对多关系,它有一个级联删除孤立条件和一个where条件来限制集合中的项。在此映射-

<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()时,将发生以下哪两种情况

  • 将删除用户和所有电子邮件对象,包括那些deleted=true的对象
  • 已删除的用户和电子邮件对象=删除空值

  • 一方面,场景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
      过滤实体和关联,以仅获取未被软删除的实体
    这一点的灵感来自于。不过还没有测试过

    工具书类