JPA / Hibernate:ManyToMany删除关系

时间:2010-11-18 18:04:40

标签: java hibernate jpa

我有两个类,比如Group和Person,它们具有在JoinTable中映射的ManyToMany-Relation。

如果我删除与某个组有关系的Person,我想从连接表中删除该条目(不删除该组本身!)。

如何定义级联注释?我没有找到真正有用的文档,但有几个未解决的董事会讨论...

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

我相信你想要的是:

cascade = CascadeType.ALL

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

答案 2 :(得分:0)

您可以专门在数据库上执行此操作(取决于您的数据库及其功能)。通过在关系表的外键上添加“on delete cascade”。