2015-04-17 56 views
3

我有一个有些奇怪的问题,我不知道这是支持JPA:让2个不同的家长实体引用子实体通过@OneToMany在JPA

我有一个@Entity Child和两个其他实体,@Entity Parent1@Entity Parent2

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

原因是我希望Childs被删除,如果他们的Parent1被删除,Childs被删除,如果他们的Parent2被删除。

我已经尝试了多种组合,但我不能得到它的工作...

TL; DR:不具有Parent1和A Parent2任何儿童应予以删除。

这里是我的代码现在(ommitting @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; 
} 

谢谢

回答

1

是按您需要使用orphanRemoval =真@jmvivo答案是你的用例解, 这里每甲骨文在这个link

当目标实体一到一个或将一对多关系从关系中删除,通常希望将移除操作级联到目标实体。这样的目标实体被认为是“孤儿”,而orphanRemoval属性可以用来指定应该删除孤儿实体。例如,如果订单包含多个订单项,并且其中一个订单已从订单中删除,则删除的订单项将被视为孤立。如果orphanRemoval设置为true,那么当订单项从订单中删除时,订单项实体将被删除。

你也可能想看看下面SO问题,你与你的要求,进一步去

One to Many relationship JPA/Hibernate removing links

JPA 2.0 orphanRemoval=true VS on delete Cascade

1

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

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

好运气!

0

你将不得不处理这个问题上的服务/ DAO水平,我不要以为你会发现这个特定用例的任何JPA支持。只需在删除父/子之前手动检查条件。