Подтвердить что ты не робот

JPA - Когда использовать getTransaction() при сохранении объектов

Недавно я начал работать с JPA в Google App Engine. При чтении некоторых примеров я заметил пару вариаций в способе сохранения объектов. В одном случае я видел что-то вроде этого:

entityManager.getTransaction().begin();
entityManager.persist(object);
entityManager.getTransaction().commit();

В других случаях я не вижу использования getTransaction(). Я просто вижу объект entityManager.persist(object). Когда целесообразно использовать getTransaction()?

4b9b3361

Ответ 1

Если вы используете управляемый контейнером EntityManager, то вы используете транзакции JTA. Следовательно, вам не нужно (точнее - вы не можете) вмешиваться в транзакции EntityManager, извлеченные с помощью entityManager.getTransaction(). JTA запускается и совершает транзакцию.

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

Как правило, управляемый приложением EntityManager, который работает с entityManager.getTransaction(), используется в среде Java SE.

EDIT: вам может быть интересен раздел 7.5 Управление транзакциями из спецификации JPA 2.0.

Ответ 2

В GAE нет Java EE/JTA, поэтому игнорируйте такие термины, как bean управляемая транзакция (BMT) и транзакции, управляемые контейнером (CMT).

Ваша работа либо транзактивна (если вы хотите, чтобы сразу несколько объектов переместились в хранилище данных, или все провалилось - здесь вы используете getTransaction()) или нет транзакции (где все идет в хранилище данных один за другим, а сбой одного сохранения не влияет на других - здесь вы просто вызываете persist()/merge()/remove()).

Ответ 3

Google App Engine имеет управление транзакциями (https://developers.google.com/appengine/docs/java/datastore/transactions), но интерфейс транзакции JPA не знает о некоторых базовых функциях GAE (т.е. группы сущностей).

Таким образом, ваше приложение может решить, какие операции выполнять в транзакции, а какие нет. Вы должны выполнить транзакционные операции, которые должны выполняться атомарно.

Помните, как лучше всего выполнять каскадные действия и операции отношений в транзакции, потому что JPA может инициировать множество запросов, и это может привести к несовместимой ситуации с данными.

Пример использования транзакции с JPA2:

import javax.persistence.EntityTransaction;


EntityTransaction txn = em.getTransaction();
txn.begin();
try {
    //do something with your database
    txn.commit();
} 
finally {
   if (txn.isActive())
      txn.rollback(); 
}

Ответ 4

Вы используете getTransaction(), когда будете явно обрабатывать транзакции в своем приложении. С другой стороны, если вы разрешите контейнеру обрабатывать транзакции для вас, нет необходимости явно начинать/заканчивать транзакции. По сути, мы имеем дело с разницей между Контрактными управляемыми транзакциями (CMT) и Bean Управляемые транзакции (BMT).

В целом, вы должны использовать BMT, когда вам нужно больше контролировать транзакционную обработку или когда есть дополнительные технические требования (например, двухфазные коммиты, распределенные транзакции, транзакции XA), которые не могут быть удовлетворены используя CMT. Кроме того, вы должны использовать BMT, когда ваши приложения будут развернуты вне сервера приложений и будут использовать Java SE.