JPA / Hibernate: отношение удаления ManyToMany - PullRequest
10 голосов
/ 18 ноября 2010

У меня есть два класса, скажем, Group и Person с ManyToMany-Relation, которые отображаются в JoinTable.

Если я удаляю Лицо, имеющее отношение к Группе, я хочу удалить запись из объединяющей таблицы (не удалять саму группу!)

Как мне определить каскадные аннотации?Я не нашел действительно полезной документации, но несколько нерешенных обсуждений на доске ...

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 ]

3 голосов
/ 20 ноября 2010

Каскад не будет очищать оставшиеся ссылки на удаленные Person, которые остаются на объекте Group в памяти. Вы должны сделать это вручную. Кажется, что каскад должен сделать это, но, к сожалению, это не так, как он работает.

На основании информации, предоставленной в вашем вопросе, я не думаю, что вам нужны какие-либо каскадные параметры, установленные для ваших Person или Group сущностей. Не похоже, что они разделяют отношения родитель / ребенок, где существование одного зависит от другого. Это такие отношения, в которых я бы ожидал увидеть несколько вариантов каскада.

0 голосов
/ 13 ноября 2012

Вы, вероятно, можете сделать это специально для базы данных (зависит от вашей базы данных и ее возможностей).Путем добавления «каскада удаления» к внешнему ключу таблицы отношений.

0 голосов
/ 18 ноября 2010

Я верю, что вы хотите:

cascade = CascadeType.ALL

Чтобы удалить связь с БД, удалите связь из каждой группы. Удалите пользователя из коллекции Group.persons и удалите группу из коллекции Person.group, а затем сохраните объект person.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...