Hibernate Cascade УДАЛИТЬ OneToMany не работает. Нарушение ограничения ссылочной целостности - PullRequest
0 голосов
/ 20 января 2020

У меня есть класс Webtoon, который содержит список Эпизодов. Это однонаправленное отношение.

@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@CollectionTable(name= "list_of_episodes")
List<Episode> listOfEpisodes = new ArrayList<>();

В моем модульном тесте я создал объект Webtoon, а затем добавил эпизод в список listOfEpisodes. Когда я пытаюсь удалить Эпизод с помощью репозитория Эпизодов

this.episodeRepo.delete(episode);

, я получаю сообщение об ошибке:

нарушение де-противопоказано: "FK50GHKTDAXMN68TBU6KAYVUX9S: PUBLI C .LIST_OF_EPEYODESE LIST_OF_EPISODES_ID) REFERENCES PUBLI C .EPISODE (ID) (3) "Нарушение ограничения ссылочной целостности:" FK50GHKTDAXMN68TBU6KAYVUX9S: PUBLI C. SQL утверждение: удалить из эпизода, где id =? [23503-200]

Почему hibernate не может удалить этот объект и обновить список в классе Webtoon?

Ответы [ 3 ]

0 голосов
/ 20 января 2020

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

Из ошибки PUBLI C .LIST_OF_EPISODES FOREIGN KEY (LIST_OF_EPISODES_ID) ССЫЛКИ PUBLI C .EPISODE (ID) вы можете ясно видеть, что PUBLI C .EPISE является упоминается как внешний ключ в таблице PUBLI C .LIST_OF_EPISODES, поэтому вы не можете удалить родительский элемент, пока не удалите дочерний элемент.

Попробуйте использовать @JoinColumn вместо @CollectionTable (name = "list_of_episodes") *

0 голосов
/ 20 января 2020

Чтобы исправить эту проблему, я сначала изменил однонаправленное отношение на двунаправленное. В Webtoon у меня есть:

@OneToMany(cascade = CascadeType.ALL, mappedBy="webtoon", orphanRemoval = true)
@CollectionTable(name= "list_of_episodes")
List<Episode> listOfEpisodes = new ArrayList<>();

В Эпизоде ​​я добавил атрибут webtoon

@ManyToOne(fetch= FetchType.LAZY)
@JoinColumn(name="webtoon_id")
Webtoon webtoon;

Потому что он ленивый ... Я не мог получить список, как будто я используя eager, поэтому я добавил объединение выбрать в моем хранилище. А также, когда я удаляю, у меня есть каскадное удаление.

0 голосов
/ 20 января 2020

Попробуйте изменить FetchType с EAGER на LAZY

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