JPA (Hibernate) шаблоны для написания / обновления Entites - PullRequest
0 голосов
/ 27 июня 2019

Есть ли какая-либо документация, связанная с написанием / обновлением более сложных сущностей 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:

  • много запросов на отдых

  • меньшая вероятность оптимистических проблем параллелизма

Знаете ли вы, еслиуже есть какие-то передовые практики или какие-то учебники, связанные с этим?

...