EntityManager.contains () возвращает false после persist () - PullRequest
5 голосов
/ 16 декабря 2011

Документация для EntityManager.persist() говорит, что будет Make an instance managed and persistent.

Он сохраняет сущность в базе данных, но когда я вызываю метод EntityManager.contains(), чтобы проверить, управляется ли сущность, которую я только что сохранил, она возвращает false.

Я просто хочу знать, почему это происходит? Может быть, есть что-то, что я не смог сделать, или что-то, что я упустил?

Предложения будут оценены: D

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

Это действительно странно. Согласно спецификации Sun EJB3 :

Метод contains() может использоваться для определения, является ли объект экземпляр управляется в текущем контексте постоянства.

Метод contains возвращает true:

  • Если объект был извлечен из базы данных и не был удален или отсоединен.
  • Если экземпляр сущности является новым, и для сущности был вызван метод persist или для него была выполнена каскадная операция.

Метод contains возвращает false:

  • Если экземпляр отключен.
  • Если для объекта был вызван метод remove или к нему была каскадно удалена операция удаления.
  • Если экземпляр новый, и метод persist не был вызван для объекта или операция persist не была каскадно это.

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

Вы звоните contains в той же транзакции?

0 голосов
/ 17 декабря 2011

мы сделали некоторый обходной путь, вместо того, чтобы сохранять> обновление, мы просто взяли автоматически сгенерированный ключ из хранилища данных и присвоили его вручную ключевым полям сущности, а затем сохранили его.

...