ManyToMany с каскада всички само каскадни по една посока

Имам 2 обекта: 1) Потребител 2) Отдел.

всеки съдържа SET от другия, тъй като връзката между тях е многокъммного,

Маркирах (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
Сега съм доста неохотен да използвам този механизъм и да направя кода си мръсен с много dao извиквания за груби операции на отдели, когато го правя за потребители... - person Urbanleg; 14.08.2013