【问题标题】:Make 2 different Parent Entities reference a Child Entity through @OneToMany in JPA通过 JPA 中的 @OneToMany 使 2 个不同的父实体引用一个子实体
【发布时间】:2015-06-24 04:27:21
【问题描述】:

有个有点奇怪的问题,不知道JPA是否支持这个:

我有一个@Entity Child 和另外两个实体@Entity Parent1@Entity Parent2

我想做的是在 Parent1 和 Child 之间建立 @OneToMany 关系,在 Parent2 和 Child 之间建立另一个 @OneToMany 关系。

原因是我希望 Childs 在 Parent1 被删除时被删除,而 Childs 在 Parent2 被删除时被删除。

我尝试了很多组合,但我无法让它发挥作用......

TL;DR:任何没有 Parent1 和 Parent2 的 Child 都应该被删除。

这是我现在的代码(省略 @Id 和 getter/setter):

@Entity
class Parent1 {
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    Set<Child> childs;
}

@Entity
class Parent2 {
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    Set<Child> childs;
}

@Entity
class Child {
    String name;
}

谢谢,

【问题讨论】:

    标签: java spring hibernate jpa spring-data-jpa


    【解决方案1】:

    是的,根据@jmvivo 的回答,您需要使用 orphanRemoval=true 是您的用例的解决方案, 这里根据 Oracle 在这个link

    当一对一或一对多关系中的目标实体从关系中删除时,通常希望将删除操作级联到目标实体。此类目标实体被视为“孤儿”,并且 orphanRemoval 属性可用于指定应删除的孤儿实体。例如,如果一个订单有许多订单项,并且其中一个已从订单中删除,则删除的订单项将被视为孤立订单项。如果 orphanRemoval 设置为 true,则当从订单中移除订单项时,订单项实体将被删除。

    当您进一步满足您的要求时,您可能还想查看下面的 SO 问题

    One to Many relationship JPA/Hibernate removing links

    JPA 2.0 orphanRemoval=true VS on delete Cascade

    【讨论】:

      【解决方案2】:

      阅读OneToMany.ophanRemoval,你可以试试这个:

      @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval=true)
      Set<Child> childs;
      

      祝你好运!

      【讨论】:

        【解决方案3】:

        您必须在服务/DAO 级别处理此问题,我认为您不会找到任何针对此特定用例的 JPA 支持。只需在删除父/子之前手动检查条件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多