JPA - когда использовать getTransaction () при сохранении объектов - PullRequest
28 голосов
/ 11 декабря 2011

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

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

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

Ответы [ 4 ]

19 голосов
/ 11 декабря 2011

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

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

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

РЕДАКТИРОВАТЬ: Возможно, вас заинтересует раздел 7.5 Управление транзакциями из спецификации JPA 2.0 .

5 голосов
/ 11 декабря 2011

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

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

3 голосов
/ 06 декабря 2013

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(); 
}
0 голосов
/ 11 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...