Потеря внешнего ключа слияния JPA

#java #mysql #hibernate #jpa

#java #mysql #переход в спящий режим #jpa

Вопрос:

Я новичок в реализации гибернации JPA и пытаюсь понять, как работает EntityManager.merge.
У меня есть следующий сценарий двух классов с отношением @ManyToOne, например

 class A{
   private String name;
   ........
   get...
   set...
}

class B{
   private String name;

   @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE)
   private A a;
   ........
   get...
   set...
}
  

И у меня есть графический интерфейс, в котором вы можете просматривать и изменять только свойства B — класс A не загружен, и в поле зрения нет открытого сеанса.
При попытке сохранить (объединить) изменения в серверной части:

 entityManager.merge(b); //the object "b" created from view has "a" set to null
  

В базе данных в таблице B отношение внешнего ключа (ссылающееся на таблицу A) потеряно — установлено значение null;
Это не то, что я хочу, я хочу сохранить отношения и объединить-сохранить изменения, внесенные в графический интерфейс, в объект B, не теряя отношения «Многие к одному»
Возможно, то, что я ожидаю, невозможно, и что мне нужно сделать, это:

  dbB b = entityManager.find(B.class, id);
 dbB.setName(b.getName());
 dbB.set........
 entityManager.merge(dbB);
  

Ответ №1:

Если в entityManager.merge(b); отношении b.a равно null, merge будет удален внешний ключ. Это потому, что значение null не означает, что ссылка должна игнорироваться, но что ссылка должна быть удалена (т. Е. Ссылки больше нет).

Я хочу сохранить связь и объединить -сохранить изменения, внесенные в графический интерфейс, в объект B, не теряя отношения «Многие к одному»

Одним из вариантов было бы прочитать объект из базы данных с a инициализацией на отложенный прокси и передать его в графический интерфейс. Во время этого процесса объект, скорее всего, отсоединится, и, следовательно, вам необходимо объединить его во время сохранения. Однако, поскольку a в этом случае не будет null, ссылка не должна теряться.