Ответ 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