JPA ManyToMany и однонаправленное удаление - PullRequest
1 голос
/ 05 мая 2020

У меня следующие отношения:

class Product { // 10000s many of them

 @ManyToMany
 List<Category> categories; //usually 0-5 

}

и

class Category {
...with no back link...
}

теперь, если я удалю категорию, а затем загружу продукт с этой категорией, я получу сообщение об ошибке который содержит:

обновление или удаление в таблице «категорий» нарушает ограничение внешнего ключа (...) по-прежнему ссылается на таблицу product_category

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

Это может быть так просто, если использовать обычный SQL, но я хотел бы сохранить автоматическую c загрузку категорий и сопоставление свойств. Есть ли легкий способ автоматически сделать это без сохранения списка продуктов в каждой категории ?

1 Ответ

0 голосов
/ 06 мая 2020

То, что вы пытаетесь сделать, не имеет большого смысла, ИМО.

Вы хотите сохранить однонаправленную связь, но хотите, чтобы другая сторона была удалена напрямую. Но я понял, что проблема заключалась в огромном наборе данных (категория -> продукт).

Одним из способов решения этой проблемы было бы смешивание в одной транзакции JPQL (для удаления категории) и собственного запроса (для удалить строки из объединенной таблицы).

em.createNativeQuery("delete from product_category where category_id = ?").setParameter(1, category.getId()).executeUpdate();
em.remove(category);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...