В чем разница между @Resource UserTransaction и EntityManager.getTransaction () - PullRequest
30 голосов
/ 25 марта 2010

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

@Resource
UserTransaction objUserTransaction;

и

EntityManager.getTransaction();

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

Ответы [ 3 ]

27 голосов
/ 25 марта 2010

EJB - это транзакционные компоненты. Транзакция может управляться либо самим сервером приложений (CMT - транзакция, управляемая контейнером), либо вручную вами внутри EJB (BMT - транзакция, управляемая бином).

EJB поддерживает распределенные транзакции через спецификацию JTA. Распределенная транзакция контролируется с использованием UserTransaction, который имеет методы begin, commit, rollback.

С CMT сервер приложений запускает, фиксирует и откатывает транзакцию (в соответствии с аннотациями транзакций ) для вас, и вы не можете вмешиваться. Это означает, что в этом случае вы не должны получать доступ к UserTransaction. Однако с BMT вы делаете это вручную и сами контролируете транзакцию, используя UserTransaction.

Давайте теперь перейдем к EntityManager. Реализация JPA может использоваться как на сервере приложений, так и отдельно. При использовании в автономном режиме вам нужно использовать EntityManage.getTransaction, чтобы разграничить транзакцию JDBC самостоятельно. При использовании на сервере приложений EntityManager прозрачно взаимодействовал с менеджером распределенных транзакций JTA.

В большинстве случаев вы используете CMT с аннотацией @Required в EJB. Это означает, что вам не нужно обращаться ни к UserTransaction, ни к EntityManager.getTransaction. Приложение. Сервер запускает и фиксирует транзакцию, но также выполняет откат, если возникает исключение. Это то, что я бы порекомендовал для вашего фасада.

(Есть и другие тонкости, такие как PersistenceContextType или ручное включение менеджера сущностей в распределенную транзакцию с EntityManager.joinTransaction, но это только если вы используете технологии по-разному, как по умолчанию).

8 голосов
/ 25 октября 2013

UserTransaction относится к объекту транзакции JTA . Вы сможете использовать его только в том случае, если на сервере приложений доступен модуль JTA: например, если вы развертываете приложение с этим на Tomcat (который по умолчанию не поддерживает JTA), код, полагающийся на это, потерпит неудачу , Это тип транзакции по умолчанию, используемый в EJB и MDB.

EntityManager.getTransaction() извлекает локальную сущность транзакции. Это также иногда называют ресурсом локальной транзакции.

Локальные транзакции ресурса очень отличаются от транзакций JTA: среди прочего, локальные транзакции ресурса специфичны для ресурса, тогда как транзакции JTA имеют тенденцию быть специфичными для определенного потока.

Дополнительные сведения о разнице между локальными ресурсами и транзакциями JTA см. В ответе на этот стекопоток: В чем разница между JTA и локальной транзакцией?

0 голосов
/ 22 ноября 2014

В дополнение к ответу @ 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-компоненты в качестве веб-служб.

...