使两个不同的父实体通过JPA中的@OneToMany引用子实体

时间:2015-04-17 10:50:22

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

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

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

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

原因是我希望删除Parent1时删除Childs,如果删除Parent2则删除Childs。

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

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

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

@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;
}

谢谢,

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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 :(得分:0)

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