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
, но это только если вы используете технологии по-разному, как по умолчанию).