У меня есть родитель, который хранит список детей.
Позволяет написать для него DDL.
TABLE parent (
id integer pk
)
TABLE child(
id integer pk
parent_id integer FOREIGN KEY (parent.id)
)
Когда я обновляю детей (добавляю / редактирую / удаляю), есть ли способ автоматически решить, какой дочерний элементудалить или изменить на основе внешнего ключа?
Предполагается, что у вас есть новый дочерний элемент № 5, связанный с родительским элементом № 2, и:
- FK в DDL являетсяправильно
- Сущности знают FK
- Вы используете тот же jpa-контекст
- Транзакция выполняется правильно
Затем каждый вызовparent.getChilds()
должен (!) Вернуть все сущности, которые существуют до того, как ваша транзакция была выполнена и тот же экземпляр сущности, которую вы только что зафиксировали в базе данных.
Затем,если вы удалите дочерний элемент № 5 из родительского элемента № 2, и транзакция, успешно выполненная parent.getChilds()
, должна вернуть все объекты без дочерний элемент № 5.
Особый случай:
Если выудалите родительский # 2, и у вас есть каскадное удаление в DDL, а также в Java-коде все чиldrens должны быть удалены из базы данных, а также родительский номер 2 в базе данных, которую вы только что удалили.В этом случае родительский номер 2 больше не связан с jpa-контекстом, а все дочерние элементы родительского номера 2 больше не связаны с jpa-контекстом.
= Edit =
Youможет использовать merge
.Это будет работать для конструкций, подобных этой:
POST {
"coordinates": [{
"lat":"51.33",
"lon":"22.44"
},{
"lat":"50.22",
"lon":"22.33"
}]
}
Будет создана одна строка в таблице "allow" и две строки в таблице "координата", обе координаты привязаны к строке разрешения.Результат будет включать в себя набор идентификаторов.
Но: Вам нужно будет выполнить валидацию (убедитесь, что идентификатор равен нулю, проверьте, что координаты не ссылаются на другое разрешение, ...)!
Удаление координат должно быть выполнено методом DELETE:
DELETE /permit/972/coordinate/3826648305