JPA /休眠:ManyToMany删除关系

问题描述:

我有两个类,说Group和Person与JoinTable中映射的ManyToMany关系。JPA /休眠:ManyToMany删除关系

如果我删除与组关联的人员,我想从联接表中删除条目(而不是删除组本身!)。

我该如何定义cascade-Annotations?我没有发现一个真正有用的文档,但几个未解板的讨论......

public class Group { 
    @ManyToMany(
     cascade = { javax.persistence.CascadeType.? }, 
     fetch = FetchType.EAGER) 
    @Cascade({CascadeType.?}) 
    @JoinTable(name = "PERSON_GROUP", 
     joinColumns = { @JoinColumn(name = "GROUP_ID") }, 
     inverseJoinColumns = { @JoinColumn(name = "PERSON_ID") }) 
    private List<Person> persons;  
} 

public class Person { 
    @ManyToMany(
     cascade = { javax.persistence.CascadeType.? }, 
     fetch = FetchType.EAGER, 
     mappedBy = "persons", 
     targetEntity = Group.class) 
    @Cascade({CascadeType.?}) 
    private List<Group> group; 
} 

我相信你想要的是:

cascade = CascadeType.ALL 

要删除DB关系,从每个组中删除的关联。从Group.persons集合中删除此人,并从Person.group集合中删除该组,然后保留您的人员对象。

+0

我想在删除人物对象时自动删除关联。我的意图是不必手动执行此操作。如果必须,我不需要级联。还是我的Cascading-feature错误? – tautologe 2010-11-19 00:10:56

+0

你必须。级联不这样做。 – 2010-11-19 04:00:49

级联不会清除剩余的引用到保留在内存中的Group对象上的已删除的Person。你必须手动完成。似乎级联应该这样做,但可悲的是,这不是它的工作方式。

根据您提问中提供的信息,我不认为您需要在您的PersonGroup实体上设置任何级联选项。听起来不像他们分享父母/子女关系,而一个人的存在取决于另一个。这是我期望看到一些级联选项的那种关系。

+0

嗯好的,谢谢。顺便说一句。在哪里有一个可用的级联文档,以及如何以合理的方式组合jpa和hibernate注释? – tautologe 2010-11-20 22:09:51

+0

我使用Hibernate作为提供者,但我只通过JPA接口与它交互。我不是回答有关Hibernate特定注释问题的合适人选。抱歉。 – 2010-11-21 15:05:14

你可以专门做一个数据库(取决于你的数据库和它的能力)。通过在关系表的外键上添加“删除级联”。