Ответ 1
Мое рудиментарное понимание состоит в том, что UserTransaction используется, когда JTA требуется (например, делать запросы на mulitple), и что EntityTransaction используется, когда JPA требуется только (например, когда запрос является атомарным).
Это в основном правильно, но ваше описание "нескольких вещей" и "атомарных" немного странно. JTA позволяет разработчику использовать распределенную транзакцию для выполнения изменений в мультипликативных ресурсах (база данных, JMS-брокера и т.д.) Атомарно (все или ничего). Если доступен только один ресурс (например, одна отдельная база данных), вам не нужна JTA, но транзакция по-прежнему является атомной (все или ничего). Это, например, случай, когда вы используете обычную транзакцию JDBC в одной базе данных.
Учитывая UserTransaction
vs. EntityTransaction
:
- Если JPA используется автономно, вы используете
EntityTransaction
для разграничения транзакции самостоятельно. - Если JPA используется в управляемой среде, где он интегрируется с JTA, вы используете
UserTransaction
.EntityManager
перехватывает себя в диспетчере распределенных транзакций JTA. Единственная тонкость, о которой я знаю, касается флеша изменений. Когда используетсяEntityTransaction
, JPA знает, что нужно сбросить изменения. Если транзакция контролируется с помощьюUserTransaction
, ей необходимо зарегистрировать обратный вызов, используя JTAregisterSynchronization
, чтобы изменения были сброшены в базу данных до завершения транзакции. Если вы используете EJB с CMT (транзакция, управляемая контейнером), вам даже не нужно использоватьUserTransaction
: сервер приложений запускает и останавливает транзакции для вас.
Похожие вопросы: