Удаление дочерних записей из базы данных, когда они отсутствуют в объекте с помощью @OnetoMany в JPA / Hibernate (загрузочное приложение Spring) - PullRequest
0 голосов
/ 05 марта 2020

Я занимаюсь разработкой веб-приложения Spring Boot с использованием JPA / Hibernate. Приложение получает записи данных в формате JSON, которые сопоставляются с классами @Entity. Макет довольно прост, у него есть основной класс сущностей с одним набором дочерних сущностей. Я сопоставляю их через @ OneToMany / @ ManytoOne. Синтаксический анализ, чтение данных из БД, вставка / обновление данных в БД прекрасно работает со стандартными функциями репозитория JpaRepository ....

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

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

Теперь у меня вопрос: нет ли более элегантного способа добиться этого с помощью JPA / Hibernate? , Некоторая аннотация или вариант или что-то. Я не нашел подход, который работал для меня еще. Какие у вас идеи?

обновление: моя проблема не в том, чтобы удалить родительскую сущность, а затем удалить дочернюю запись. Родительский объект остается без изменений (или обновляется ...). Я хочу удалить только дочерние записи, и только те, которые отсутствуют в текущем объекте запроса, но в базе данных.

Пример: в базе данных в родительской таблице есть запись с parentID = 1. В дочерней таблице хранятся 3 записи, на которые ссылаются childID 1, 2, 3.

Теперь клиент отправляет мне объект с parentID = 1 для обновления в базе данных. В дочернем наборе присутствуют только дочерние объекты с childID 1 и 2. Теперь задача состоит в том, чтобы обновить объекты (что бы ни изменилось в полях), удалив дочернюю запись с id = 3 из базы данных

спасибо и приветствия.

1 Ответ

0 голосов
/ 05 марта 2020

Я думаю, это то, что вы хотите использовать каскадно. Например, Cascase.REMOVE автоматически удалит все дочерние объекты, на которые нет ссылок.

Вы можете использовать его следующим образом:

@OneToMany(cascade = CascadeType.REMOVE)

Хороший обзор можно найти здесь: https://www.baeldung.com/jpa-cascade-types

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