java - 清除关联子项列表后的 session 更新不会删除它们

标签 java hibernate jakarta-ee one-to-many

我正在使用具有以下父子关系的 Hibernate 2.1.8:

public class Parent     {
    private Set<Child> children = new HashSet<Child>();
}

public class Child{
    private Parent parent;
}

Hibernate 映射如下:

<hibernate-mapping>
    <class name="Parent" table="parent">
        <id name="id" column="parent_id" unsaved-value="0" type="int"> 
            <generator
                class="com.mx.releasemgr.db.hibernate.HibernateIdentityGenerator" />
        </id>
...
        <set name="children" table="child" inverse="false" cascade="all-delete-orphan">
            <key column="parent_id" />
            <one-to-many class="child"/>
        </set>   
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="com.mx.releasemgr.domain.ImplementationProjectChange" table="implementation_project_change" >
        <id name="id" column="implementation_project_change_id" unsaved-value="0" type="int">
            <generator class="com.mx.releasemgr.db.hibernate.HibernateIdentityGenerator"/>
        </id>

        <many-to-one name="parent" column="parent_id" class="Parent" not-null="true"/>
    </class>
</hibernate-mapping>

如果执行下面的代码,child(ren)的parent_id列只会被设置为NULL,但记录不会被删除。我希望子记录也被删除,但无法弄清楚。

parent.getChildren().clear();
session.update(parent);

如果我用一个空集合更新父集合,我怎样才能让子集合被删除?

最佳答案

在 Hibernate 中,如果您有一个 ManyToOne,那么它始终是关系的第一类拥有方(除非您的 ManyToOne 由连接表而不是多方的列表示)。换句话说,没有办法在关系的 Many 端设置 inverse=true

当您创建一个 OneToMany 时,如果您指定 inverse=false 那么您将创建关系的另一个一等拥有方。

您创建的是一个无效的场景,Hibernate 认为存在两个完全独立的关系并且没有将它们链接在一起。

以下场景有效:

  • 只有带inverse=false的OneToMany
  • 只有ManyToOne
  • 在 OneToMany 上同时使用 inverse=true 的 OneToMany 和 ManyToOne
  • 使用连接表

我不知道有什么方法可以建立一方是拥有方的双向关系。如果您想要双向关系,可能最简单的解决方法是在 Parent 类上设置 inverse=true,然后将您的代码调整为:

for(ImplementationProjectChange child : parent.getChildren()) { 
  child.setParent(null);
}
parent.getChildren().clear();
session.update(parent); 

关于java - 清除关联子项列表后的 session 更新不会删除它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115710/

相关文章:

jakarta-ee - 如何在 JBoss 远程 EJB 调用中获取客户端 IP 地址?

java - Guice辅助注入(inject),绑定(bind)订单

java - 病毒图像的风险

java - Thymeleaf:在 thymeleaf 中创建动态 URL 查询字符串

java - org.hibernate.QueryException : could not resolve property: is_approved of: com

java - @Singleton @Startup 依赖于@Stateless EJB

java - 如何在包含 Magisk 应用程序的 root 设备中限制我的 Android 应用程序?

java - HQL 检查字段是否包含字符串列表中的任何字符串

hibernate - Log4j + hibernate 5 + Weblogic 12.2.1

java - 如何模块化和自定义 Web 应用程序?