В чем разница между @Resource UserTransaction и EntityManager.getTransaction()
Может кто-нибудь объяснить, в чем разница между:
@Resource
UserTransaction objUserTransaction;
и
EntityManager.getTransaction();
А также что такое транзакция, управляемая контейнером? и как мне это сделать на моем фасаде сеанса, если я хочу вставить три строки в таблицу в транзакции.
Ответы
Ответ 1
EJB - это транзакционные компоненты. Транзакция может управляться либо самим сервером applicaiton (CMT - транзакция, управляемая контейнером), либо вручную самостоятельно в транзакции EJB (BMT - bean).
EJB поддерживает распределенную транзакцию через спецификацию JTA. Распределенная транзакция управляется с помощью UserTransaction
, которая имеет методы begin
, commit
, rollback
.
С CMT сервер приложений запускает, фиксирует и откатывает транзакцию (в соответствии с PersistenceContextType
или ручной набор менеджера объектов в распределенной транзакции с EntityManager.joinTransaction
, но это только если вы используете технологии по-разному, как по умолчанию).
Ответ 2
UserTransaction
относится к сущности транзакции JTA. Вы сможете использовать это только в том случае, если на сервере приложений есть модуль JTA: например, если вы развертываете приложение с этим в Tomcat (которое по умолчанию не поддерживает JTA), код, основанный на этом, не будет работать, Это тип транзакции по умолчанию, используемый в EJB и MDB.
EntityManager.getTransaction()
извлекает локальный объект транзакции. Это также иногда называют локальной транзакцией ресурсов.
Локальные транзакции ресурсов сильно отличаются от транзакций JTA: среди прочего, локальные транзакции ресурсов специфичны для ресурса, тогда как транзакции JTA имеют тенденцию быть конкретными для конкретного потока.
Дополнительные сведения о различиях между локальными ресурсами и транзакциями JTA см. в этом ответе на stackoverflow: В чем разница между JTA и локальной транзакцией? p >
Ответ 3
В дополнение к ответу @Marco, который хорошо объясняет разницу между локальными транзакциями JTA и ресурсами.
Управляемые контейнером транзакции [как они названы] управляются контейнером, а не вашим приложением. Это делается через уровень EJB, где вам просто нужно написать свой метод, и контейнер будет обертывать метод вокруг контекста транзакции, поэтому, если какая-либо часть вашего метода или его вызовы более низкого уровня вызывают исключение, транзакция будет отката.
Он также может быть точно настроен с использованием аннотаций. Более подробную информацию можно найти здесь https://docs.oracle.com/javaee/5/tutorial/doc/bncij.html
Обратите внимание, что это выполняется только через EJB, а администраторы сущностей, которые вводятся на веб-уровне (например, сервлеты или REST API), не управляются контейнером, и в этом случае вам нужно искать транзакцию, используя @Resource UserTransaction
или EntityManager.getTransaction
, begin()
и commit()
.
Из Java EE 6 вам разрешено иметь EJB внутри веб-уровня, поэтому вам не нужно иметь слишком сложный макет проекта, если вы не захотите открыть свои EJB в качестве веб-служб.