Как НЕ каскадно удалять рекурсивные отношения? - PullRequest
2 голосов
/ 25 ноября 2011

У меня есть объект, имеющий отношение к ManyToMany:

@Entity
public class User {

    @Id
    private Long id;

    @ManyToMany
    private List<User> friends;
}

Как удалить пользователя, не удаляя всех его друзей?Я не могу использовать каскадные удаления, очевидно.Если я пытаюсь удалить пользователя без каскадирования, я получаю следующее сообщение об ошибке: «Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется»

Ответы [ 3 ]

1 голос
/ 25 ноября 2011

Обычно с ManyToMany мы сопоставляем данные в разных таблицах, и удаление не создаст особых проблем. Я чувствую, что у вас другой случай, и у вас есть личные отношения. Я думаю, что вам нужно использовать некоторые другие способы для выполнения этого действия.

How can I delete a user without deleting all of his friends? Опция ниже является одним из них.

Учитывая ваше специальное сопоставление, List<User> в User, вы должны только обновлять ссылки на таблицы сопоставления и не удалять ничего из таблицы User. Поскольку они могут иметь некоторые другие User как друзья, и это может создать проблемы.

1 голос
/ 25 ноября 2011

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

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

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

Чтобы удалить пользователя, необходимо удалить этого пользователя из списков friends всех остальных пользователей, поскольку в базе данных эти ссылки являются внешними ключами. Это удаление не может быть выполнено автоматически, то есть с аннотацией.

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