Есть ли какая-либо документация, связанная с написанием / обновлением более сложных сущностей JPA (Hibernate)?
Например, если у меня есть отношение один-ко-многим в моей БД, я пока могу видеть несколько вариантов этой вещи.что я хочу сделать:
Вариант 1 (если для обновления имеется небольшое количество детей):
class OneDto{
Long id;
String attributeMod;
String attributeDontMod;
List<ChildDto> children; //used to add or update children to "one" entity. In case we do update - children that is not in list will be deleted, those that have id=null will
//be created and linked to this "one" entity, and those that have id=[some_number] will be updated and linked to this "one" entity
}
class ChildDto{
Long id;
String attributeMod;
String attributeDontMod;
}
в этом случае - я могу переслать полныйJSON сериализует объект от внешнего интерфейса до внутреннего, где он будет десериализован в этих DTO, и тогда я могу просто вызвать oneRepo.save(doTheMappingToOne(oneDto))
->, который сохранит один и его дочерние элементы в БД.И в случае, если я хочу что-то обновить, я просто вызываю тот же метод oneRepo.save(doTheMappingToOne(oneDto))
->, который объединит все сущности в БД.
Вариант 2 (если много детей)
В случае если много дочерних элементов, мы не можем отправить все данные из внешнего интерфейса в бэкэнд (все дочерние элементы, поскольку данных может быть много, и мы не хотим обновлять тожемного записей).В этом случае я думаю, что мы можем использовать что-то вроде этого:
class OneDto{
Long id;
String attributeMod;
String attributeDontMod;
List<ChildDto> childrenToAdd; //used if we want to add children that is not yet in DB and attach them to this "one" entity
List<ChildDto> childrenToAddAndUpdate; //used if we want to update existing entites and attach them to this "one" entity
List<Long> childrenIdsToDelete; //used in case that we want to update existing "one" entity - to remove children
}
class ChildDto{//same as above}
здесь мы можем использовать childrenToAdd
при записи в БД и childrenToAddAndUpdate
для существующих объектов в БД (в случае, если мы хотим изменить свойствадетей и в то же время связать его с родительской one
сущностью).childrenIdsToDelete
используется для удаления потомков, которые уже связаны с родительской сущностью one
;
Опция 3:
class OneDto{
Long id;
String attributeMod;
String attributeDontMod;
}
class ChildDto{
Long id;
Long oneId;
String attributeMod;
String attributeDontMod;
}
, в этом случае мы имеем толькодва DTO, и никакого отношения вообще.когда мы впервые сохраняем сущность, мы делаем oneRepo.save(doTheMappingToOne(oneDto))
-> и сохраняем только «одну» сущность без дочерних элементов;затем мы отправляем отдельные запросы для childRepo.save(doTheMappingChild(childDto))
->, где мы добавляем этого потомка к родителю.Нам также потребуются отдельные конечные точки для удаления дочерних элементов из родительских и изменения дочерних элементов.
Вариант 1:
более простой dtos (поскольку нам не нужна дополнительная логика для удаления /обновление)
больше проблем с оптимистичным параллелизмом, поскольку, если кто-то изменяет дочернюю сущность, все обновление может быть отклонено
Опция 2:
может обрабатывать больше дочерних объектов (поскольку объекты, которые не были затронуты во время редактирования, не передаются в бэкэнд).более сложный код.
больше проблем с оптимистичным параллелизмом, поскольку, если кто-то изменяет дочернюю сущность, все обновление может быть отклонено
Вариант 3:
Знаете ли вы, еслиуже есть какие-то передовые практики или какие-то учебники, связанные с этим?