Есть ли разница между getTransaction (). Begin () /. Commit () и joinTransaction () с JPA2 / EclipseLink? - PullRequest
0 голосов
/ 07 сентября 2011

Я использую JPA2 с аннотациями и EclipseLink, и мне интересно, есть ли разница между

EntityManager em = ...
// Some action
em.joinTransaction();
em.close();

и

EntityManager em = PU.entityManager();
em.getTransaction().begin();
// Some action
em.getTransaction().commit();
em.close();

, и какой из них мне лучше всего выбрать?

1 Ответ

2 голосов
/ 07 сентября 2011

EntityManager.joinTransaction предназначен для использования в транзакциях JTA (имеется в виду, что блок персистентности настроен на использование транзакций JTA), тогда как EntityTransaction.begin предназначен для использования в качестве ресурса - локальные менеджеры сущностей (подразумевающие неиспользование JTA для управления транзакциями). Следовательно, они оба предназначены для использования в разных сценариях.

Первый случай, т. Е. EntityManager.joinTransaction, используется редко, поскольку вам часто приходится внедрять управляемые контейнером EntityManager экземпляры, когда вам нужна поддержка транзакций JTA. Управляемые контейнером EntityManager вводятся (используя аннотацию @PersistenceContext) в контекст существующей транзакции JTA (управляемой контейнером), и, следовательно, нет необходимости явно присоединяться к транзакции. Только в случае управляемых приложением EntityManager s вам необходимо присоединиться к существующей транзакции. Управляемые приложения EntityManager s не вводятся контейнером; вместо этого контейнер может внедрить только экземпляр EntityManagerFactory (используя аннотацию @PersistenceUnit), который используется приложением для получения экземпляра EntityManager.

Во втором случае, т. Е. EntityTransaction.begin, никакие транзакции JTA не будут использоваться для определения объема транзакции. Вместо этого транзакция является локальной в отношении ресурсов, так как любые изменения, внесенные в контекст постоянства, отслеживаются как элементарные единицы, пока не будет вызван EntityTransaction.commit. В приложениях Java EE редко используются локальные менеджеры объектов, поскольку обычно требуется, чтобы EJB (и контейнер EJB) определяли границы транзакций, а не исходный код приложения. Кроме того, любая транзакционная работа, выполняемая с использованием локальной транзакции ресурса, не будет отслеживаться транзакцией JTA, которая, возможно, уже была инициирована, что приведет к неопределенному, запутанному и неоднозначному поведению транзакционных операций в вашем приложении.

...