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 отсутствует тип транзакции. Это правильно?


person Germano Massullo    schedule 26.06.2013    source источник


Ответы (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
  • Вы должны использовать EntityTransaction API для начала/фиксации каждого вызова вашего EntityManger
  • Двойной вызов entityManagerFactory.createEntityManager() приводит к двум отдельным экземплярам EntityManager и, следовательно, к двум отдельным PersistenceContexts/Caches.
  • Почти никогда не рекомендуется использовать более одного экземпляра EntityManager (не создавайте второй, если вы не уничтожили первый)

JTA

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

  • Вы не можете использовать EntityManagerFactory, чтобы получить EntityManager
  • Вы можете получить только EntityManager из контейнера
  • EntityManager можно ввести только через аннотацию @PersistenceContext (не @PersistenceUnit).
  • Вы не можете использовать @PersistenceUnit для ссылки на блок типа JTA.
  • EntityManager, заданный контейнером, является ссылкой на PersistenceContext/Cache, связанный с транзакцией JTA.
  • Если транзакция JTA не выполняется, EntityManager нельзя использовать, поскольку нет PersistenceContext/Cache.
  • Каждый со ссылкой EntityManager на одну и ту же единицу в одной и той же транзакции автоматически будет иметь ссылку на одну и ту же PersistenceContext/Cache
  • PersistenceContext/Cache сбрасывается и очищается во время фиксации JTA.
person Jiri Kremser    schedule 26.06.2013
comment
Я думаю, вы немного ошиблись с названиями двух списков: может быть, вы их перетасовали? - person Germano Massullo; 27.06.2013
comment
и, очевидно, вы также можете использовать JTA в среде JavaSE и самостоятельно получать EM из EMF... например, при использовании автономного поставщика JTA. Возможно, ваши списки относятся к JavaSE и JavaEE, а не к JTA и RESOURCE_LOCAL. - person DataNucleus; 27.06.2013
comment
Практически никогда не рекомендуется использовать более одного экземпляра EntityManager. Это ваше мнение? Часто необходимо иметь несколько открытых EntityManager в параллельном приложении. В общем, очень хороший ответ. - person Samuel; 01.08.2014
comment
Я использовал RESOURCE_LOCAL без необходимости начинать и завершать транзакции самостоятельно. Я думаю, что RESOURCE_LOCAL больше похож на то, что я хочу протестировать эту базу данных, используя локальную тестовую память, что очень полезно для тестирования JUnit. - person ha9u63ar; 22.01.2015
comment
С RESOURCE_LOCAL могу ли я использовать Persistence.createEntityManagerFactory() вместо @PersistenceUnit для получения EMF? - person Zyl; 18.02.2015
comment
@Zyl: насколько я понимаю, вы можете, но вы создаете EMF полностью из возможностей управления контейнерами. Это означает, что вам нужно будет иметь драйвер jdbc в пути к классу приложения, а подключение к базе данных необходимо указать через свойства PU. Я имею в виду, что тег ‹jta-data-source› не будет отображаться при прямом подключении к базе данных. - person chalda; 05.03.2015
comment
Я не согласен с утверждением, что вам не разрешено использовать @PersistenceUnit для ссылки на модуль типа JTA. Я думаю, что вы можете легко это сделать, и вы можете использовать метод emf.createEntityManager() для получения менеджера сущностей. И вы можете использовать аргумент типа SynchronizationType, чтобы определить, следует ли немедленно присоединиться к текущей транзакции, или вы присоединитесь к ней самостоятельно при вызове метода em.joinTransaction(). - person chalda; 05.03.2015
comment
@ ha9u63ar ha9u63ar Как мне внедрить свой EntityManager, используя аннотацию PersistenceContext и LocalResource в моем модульном тесте? У вас есть пример? - person bobK; 30.09.2015
comment
Вы можете взглянуть на источник ответа с дополнительной информацией и кратким примером: tomee.apache. org/jpa-concepts.html - person Radium; 27.04.2016
comment
Я использую tomcat в качестве веб-сервера для развертывания моего приложения. Должен ли я использовать JTA или RESOURCE_LOCAL? - person iftekhar khan; 25.08.2017