2014-10-20 1 views
5

У меня есть только что созданная сущность (отсоединенная, потому что еще не сохранена в БД). Этот объект имеет еще одну сущность, которая уже существует в db (но также отключена). Таким образом, я бы использовал em.merge(myNewEntity), чтобы сохранить его.Получить идентификатор объекта JPA после слияния?

Если я хочу получить новый ID, я бы воспользовался em.flush(). Затем я вызываю myNewEntity.getId(). С persist Я получаю идентификатор, созданный DB/JPA. С merge это не так. Идентификатор объекта остается null. Почему это?

+0

это спящий режим? – Leo

ответ

13

Поскольку вы не предоставили код, я попробую хрустальный шар.

Результат операции merge не совпадает с операцией persist - объект, переданный в merge, не управляется. Скорее управляемая копия объекта создается и возвращается. Вот почему исходный новый объект не получит идентификатор. Таким образом, вместо

em.merge(newEntity); 
Long id = newEntity.getId(); 

должно быть

managedEntity = em.merge(newEntity); 
Long id = managedEntity.getId(); 
+0

Легкая догадка в хрустальном шаре, правильно? Однако, спасибо. Он задокументирован и работает так, как вы предлагали. – feder

+0

:) круто, добро пожаловать – kostja