Persistence.xml различные атрибуты типа транзакции

В файле конфигурации persistence.xml JPA вы можете иметь такую ​​строку, как:

<persistence-unit name="com.nz_war_1.0-SNAPSHOTPU" transaction-type="JTA">

или иногда:

<persistence-unit name="com.nz_war_1.0-SNAPSHOTPU" transaction-type="RESOURCE_LOCAL">

Мой вопрос:

В чем разница между transaction-type="JTA" и transaction-type="RESOURCE_LOCAL"?

Я также заметил некоторые файлы persistence.xml с отсутствием типа транзакции. Правильно ли это?

Ответ 1

По умолчанию

По умолчанию JTA в среде JavaEE и RESOURCE_LOCAL в среде JavaSE.

RESOURCE_LOCAL

С <persistence-unit transaction-type="RESOURCE_LOCAL"> вы отвечаете за EntityManager (PersistenceContext/Cache) создание и отслеживание

  • Вы должны использовать EntityManagerFactory для получения EntityManager
  • Результирующий экземпляр EntityManager представляет собой PersistenceContext/Cache EntityManagerFactory можно вводить только с помощью аннотации @PersistenceUnit (не @PersistenceContext)
  • Вам не разрешено использовать @PersistenceContext для обозначения единицы типа RESOURCE_LOCAL
  • Вы должны использовать API EntityTransaction для начала/фиксации каждого вызова вашего EntityManger
  • Вызов entityManagerFactory.createEntityManager() дважды приводит к двум отдельным экземплярам EntityManager, и поэтому два отдельных PersistenceContexts/Caches.
  • Почти никогда не рекомендуется иметь более одного экземпляра используемого EntityManager (не создавать второй, если вы не уничтожили первый)

JTA

С помощью <persistence-unit transaction-type="JTA"> контейнер выполнит EntityManager (PersistenceContext/Cache) создание и отслеживание.

  • Вы не можете использовать EntityManagerFactory для получения EntityManager
  • Вы можете получить только EntityManager, поставляемый контейнером
  • An EntityManager можно вводить только с помощью аннотации @PersistenceContext (не @PersistenceUnit)
  • Вам не разрешено использовать @PersistenceUnit для обозначения единицы типа JTA
  • EntityManager, заданный контейнером, является ссылкой на PersistenceContext/Cache, связанную с транзакцией JTA.
  • Если транзакция JTA не выполняется, EntityManager не может использоваться, потому что нет PersistenceContext/Cache.
  • Все, у кого есть ссылка EntityManager на тот же блок в той же транзакции, автоматически ссылаются на тот же PersistenceContext/Cache
  • PersistenceContext/Cache очищается и очищается во время выполнения JTA