Лучший способ заменить родителя в спящем режиме - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть 2 сущности (Родитель и Дитя), которые имеют отношение OneToMany между ними.

У Родителя есть Список Дочерних, а у Ребенка есть Родитель.

У Дочернего элемента

 @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})

в поле Родитель.

Родитель имеет

@OneToMany(mappedBy="parent", cascade = CascadeType.ALL, orphanRemoval = true)

в списке Дочерних.

Я хочу найти способ заменитьРодитель одного ребенка с другим Родителем.(т.е. измените Parent of ChildA с ParentA на ParentB)

Поскольку я хочу следовать списку Parent, я хочу удалить дочернего элемента из списка.Проблема заключается в том, что даже если я сначала добавлю ChildA в список ParentB, установите поле Parent для ChildA в ParentB и только после этого удалите его из списка Child ParentA, поскольку каким-то образом он полностью удаляет Child (очевидно, из-за OrphanRemoval)

Как сделать этот своп без изменения конфигурации спящего режима и с удалением из списка ParentA (OrphanRemoval и т. Д.)?


EDIT

Я предпочитаю избегать использования entityManager.flush ()

1 Ответ

0 голосов
/ 26 апреля 2018

Попробуйте следующим образом (ChildA имеет ParentA в качестве родителя):

  1. Load ParentA
  2. Установить для ChildA родителя значение NULL
  3. Спасите ребенка A
  4. Закрытие или сброс сеанса
  5. Открытая сессия
  6. Установить ParentB на ChildA
  7. Merge ChildA (использовать слияние, а не сохранять / обновлять / saveOrUpdate)

Я думаю, что шаги 4 и 5 могут не быть необходимыми, но я не уверен, и вы должны подать его.

Возможно 4 и 5 шагов, которые вы можете заменить на: session.evict (ParentA)

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