entityManager.getTransaction (). rollback () отсоединяет сущности? - PullRequest
3 голосов
/ 19 июля 2011

У меня есть следующий фрагмент кода:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("test")
EntityManager entityManager = emf.createEntityManager()
User user = entityManager.find(User.class, 0);
entityManager.getTransaction().begin();
entityManager.getTransaction().rollback();
entityManager.refresh(user);

В четвертой строке выдается исключение IllegalArgumentException, в котором говорится: «Объект не управляется». Если я изменю третью строку на .commit() вместо .rollback(), кажется, все работает нормально.

Что здесь происходит? Могу ли я предотвратить это?

ОБНОВЛЕНИЕ: @DataNucleus направляет меня к PersistenceContext. Как изменить контекст постоянства в моем коде?

Ответы [ 2 ]

7 голосов
/ 19 июля 2011

Из спецификации постоянства JSR-000317 для Eval 2.0 Eval :

3.3.2 Откат транзакции

Для контекста с расширенной областью действия и расширенного контекста персистентности, откат транзакции приводит к отсоединению всех ранее существующих управляемых экземпляров и удаленных экземпляров [31] .Состояние экземпляров будет состоянием экземпляров в тот момент, когда транзакция была откатана.Откат транзакции обычно приводит к тому, что постоянный контекст находится в несогласованном состоянии в момент отката.В частности, состояние атрибутов версии и сгенерированного состояния (например, сгенерированных первичных ключей) может быть несовместимым.Экземпляры, которые ранее управлялись контекстом постоянства (включая новые экземпляры, которые были сделаны постоянными в этой транзакции), могут поэтому не использоваться повторно таким же образом, как другие отсоединенные объекты - например, они могут потерпеть неудачу при передаче в операцию слияния.[32]

3 голосов
/ 19 июля 2011

В PersistenceContext из "Transaction" затем commit / rollback отсоединит объекты, используемые в транзакции.В PersistenceContext из «Extended» тогда commit / rollback не делает ничего подобного, и объекты отключаются при закрытии EM.Зависит от вашего контекста

...