Разница между UserTransaction и EntityTransaction

Заголовок говорит все: в чем разница между UserTransaction и EntityTransaction?

Мое рудиментарное понимание заключается в том, что UserTransaction используется, когда требуется JTA (например, чтобы делать запросы на mulitple things), и что EntityTransaction используется, когда требуется только JPA (например, когда запрос является атомарным).

Разве это единственное различие между двумя или есть ли что-то большее, чем это?

Ответы

Ответ 1

Мое рудиментарное понимание состоит в том, что UserTransaction используется, когда JTA требуется (например, делать запросы на mulitple), и что EntityTransaction используется, когда JPA требуется только (например, когда запрос является атомарным).

Это в основном правильно, но ваше описание "нескольких вещей" и "атомарных" немного странно. JTA позволяет разработчику использовать распределенную транзакцию для выполнения изменений в мультипликативных ресурсах (база данных, JMS-брокера и т.д.) Атомарно (все или ничего). Если доступен только один ресурс (например, одна отдельная база данных), вам не нужна JTA, но транзакция по-прежнему является атомной (все или ничего). Это, например, случай, когда вы используете обычную транзакцию JDBC в одной базе данных.

Учитывая UserTransaction vs. EntityTransaction:

  • Если JPA используется автономно, вы используете EntityTransaction для разграничения транзакции самостоятельно.
  • Если JPA используется в управляемой среде, где он интегрируется с JTA, вы используете UserTransaction. EntityManager перехватывает себя в диспетчере распределенных транзакций JTA. Единственная тонкость, о которой я знаю, касается флеша изменений. Когда используется EntityTransaction, JPA знает, что нужно сбросить изменения. Если транзакция контролируется с помощью UserTransaction, ей необходимо зарегистрировать обратный вызов, используя JTA registerSynchronization, чтобы изменения были сброшены в базу данных до завершения транзакции. Если вы используете EJB с CMT (транзакция, управляемая контейнером), вам даже не нужно использовать UserTransaction: сервер приложений запускает и останавливает транзакции для вас.

Похожие вопросы: