ManyToMany с каскадом все каскадируются только в одну сторону

У меня есть 2 сущности: 1) Пользователь 2) Отдел.

каждый содержит НАБОР другого, так как отношение между ними - manyToMany,

Я отметил (CascadeType.ALL) на объекте пользователя и объекте отдела, и когда я это делаю:

userX.getDepartments.remove(departmentX);
save(userX);

он работает так, как задумано - на самом деле это означает, что

departmentX.getUsers.contains(userX) == false.

называется неявно.

Но, когда я делаю

departmentY.getUsers.remove(userX);
save(departmentY); 

это не каскад! значит - я могу

userX.getDepartments.contains(departmentY) == true 

есть идеи, почему все каскады работают только в одну сторону? есть решение?

Спасибо


person Urbanleg    schedule 14.08.2013    source источник


Ответы (1)


Каскад не имеет отношения к тому, что вы делаете. Каскадирование означает: когда я сохраняю X, также сохраняю Y.

У вас есть двунаправленная ассоциация ManyToMany. Сторона-владелец ассоциации — Пользователь. Это означает, что каждое изменение коллекции User.departments будет сохраняться в базе данных. Другая сторона (Department.users) является обратной стороной. Это означает, что каждое изменение в Department.users будет игнорироваться Hibernate.

В ВАШУ ответственность входит выполнение операций на стороне владельца и, желательно, поддержание обеих сторон ассоциации в согласованном состоянии: когда пользователь удаляется из отдела, отдел также должен быть удален из пользователя, и наоборот. . Hibernate не заботится о том, находятся ли обе стороны в согласованном состоянии: он сохраняет состояние стороны владельца ассоциации (той, у которой нет атрибута mappedBy)

person JB Nizet    schedule 14.08.2013
comment
Теперь я довольно неохотно использую этот механизм и делаю свой код грязным с большим количеством вызовов дао для грубых операций отделов, когда я делаю это для пользователей... - person Urbanleg; 14.08.2013