См. this :
В среде Microsoft .NET сборка является частично скомпилированной библиотекой кода для использования при развертывании, управлении версиями и безопасности
BLOCKQUOTE>
EJB - это транзакционные компоненты. Транзакция может управляться либо самим сервером приложения (CMT - транзакция, управляемая контейнером), либо вручную вами внутри EJB (BMT - транзакция, управляемая компонентом).
EJB поддерживает распределенную транзакцию через спецификацию JTA. Распределенная транзакция управляется с помощью UserTransaction
, который имеет методы begin
, commit
, откат
.
При использовании CMT сервер приложений запускает, фиксирует и откатывает транзакцию (согласно аннотациям транзакции ) за вас, и вам не разрешается вмешиваться. Это означает, что в этом случае вы не должны обращаться к UserTransaction
. Однако с BMT вы делаете это вручную и сами управляете транзакцией с помощью UserTransaction
.
Теперь перейдем к EntityManager
. Реализация JPA может использоваться как на сервере приложений, так и автономно. При автономном использовании необходимо использовать EntityManage.getTransaction
, чтобы самостоятельно разграничить транзакцию JDBC. При использовании на сервере приложений EntityManager
прозрачно для вас взаимодействует с диспетчером распределенных транзакций JTA.
В большинстве случаев вы используете CMT с аннотацией @Required
в EJB.Это означает, что вам не нужен доступ ни к UserTransaction
, ни к EntityManager.getTransaction
. Приложение. сервер запускает и фиксирует транзакцию, но также заботится об откате, если возникает исключение. Это то, что я бы порекомендовал для вашего фасада.
(Есть и другие тонкости, такие как PersistenceContextType
или ручное включение диспетчера сущностей в распределенную транзакцию с помощью EntityManager.joinTransaction
, но это только если вы используете технологии в другие способы по умолчанию).