Подтвердить что ты не робот

В чем разница между @Resource UserTransaction и EntityManager.getTransaction()

Может кто-нибудь объяснить, в чем разница между:

@Resource
UserTransaction objUserTransaction;

и

EntityManager.getTransaction();

А также что такое транзакция, управляемая контейнером? и как мне это сделать на моем фасаде сеанса, если я хочу вставить три строки в таблицу в транзакции.

4b9b3361

Ответ 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 в качестве веб-служб.