Как да НЕ изтриете каскадно в рекурсивна релация?

Имам обект, който има връзка ManyToMany със себе си:

@Entity
public class User {

    @Id
    private Long id;

    @ManyToMany
    private List<User> friends;
}

Как мога да изтрия потребител, без да изтрия всичките му приятели? Очевидно не мога да използвам каскадно изтриване. Ако се опитам да изтрия потребителя без каскадно, получавам следната грешка: „Не мога да изтрия или актуализирам родителски ред: ограничението за външен ключ е неуспешно“


person Yashima    schedule 25.11.2011    source източник


Отговори (3)


Обикновено с ManyToMany ще картографираме данни в различни таблици и изтриването няма да създаде особен проблем. Мисля, че вашият случай е различен и вие имате връзка със себе си. Мисля, че трябва да използвате някои други начини за извършване на това действие.

How can I delete a user without deleting all of his friends? Опцията по-долу е една от тях.

Като се има предвид вашето специално съпоставяне, List<User> в User, трябва да само актуализирате препратките към таблицата за съпоставяне и да не изтривате нищо от таблицата User. Тъй като те може да имат някои други User като приятели и това може да създаде проблеми.

person ManuPK    schedule 25.11.2011
comment
звучи страхотно, как да направя това, без да прибягвам до естествени заявки? - person Yashima; 25.11.2011
comment
какво ще кажете за HQL? Не съм сигурен дали може да се направи с някакви опции в картографирането. - person ManuPK; 25.11.2011
comment
HQL е минимално по-добър от естествените заявки. Но предполагам, че ще трябва да прибегна до това. Що се отнася до социалните мрежи в наши дни, този проблем трябва да се появява по-често. Но тогава кракените за социални данни не обичат да изтриват данни, веднъж събрани, предполагам - person Yashima; 25.11.2011
comment
Има неща, които трябва да правите с HQL и с него поради тази причина. Гласувайте за/приемайте отговорите, ако е полезно. - person ManuPK; 30.11.2011

Всъщност не мисля, че при използване на каскадно хибернация се опитва да изтрие приятелите, обикновено трябва просто да изтрие връзката между 2 потребители, която се съхранява в друга таблица.

Ето защо имате нарушение на ограничението, ако не извършите каскада, тъй като връзката (U1,U2), която има ограничения на външен ключ и за двамата потребители, все още съществува, докато се опитвате да изтриете един от 2-мата потребители.

person Sebastien Lorber    schedule 25.11.2011
comment
@ManyToMany(cascade=CascadeType.REMOVE) -› това изтрива връзката и потребителите, току-що проверих това отново. - person Yashima; 25.11.2011
comment
няма проблем, благодаря все пак, че се опитахте да помогнете. Може да се окаже (вижте по-долу), че не мога да използвам анотации, за да поправя това - person Yashima; 25.11.2011

За да изтриете потребител, трябва да премахнете този потребител от friends списъците на всички други потребители, тъй като в базата данни тези препратки са външни ключове. Това премахване не може да се извърши автоматично, т.е. с анотация.

person Dominik    schedule 24.11.2012