JPA с не-JTA: возможно ли безопасно закрыть EntityTransaction без коммита? - PullRequest
0 голосов
/ 14 февраля 2011

Я использую JPA-Toplink и разрабатываю веб-приложение RESTful.

Здесь стоит упомянуть одну вещь.

Не используется JTA

Таким образом, мой файл persistences.xml определен как не использующий JTA.

 <persistence-unit name="kojoPU">    
        <provider>oracle.toplink.essentials.PersistenceProvider</provider>
        <non-jta-data-source>machinePrototype</non-jta-data-source>

Это позволяет менеджеру сущностей не выполнять запрос сразу с помощью executeUpdate (). Он будет ждать до принятия.

em.getTransaciton().begin();
Query query = em.createNativeQuery("DELETE FROM table1 WHERE theId = 10;");
query.executeUpdate(); //not yet executed until transaction is commited.

//continue do something...


em.getTransaction().commit(); //the query above is executed here finally

Но после транзакции.begin () есть одна большая проблема: есть какая-либо ошибка, например JSONException или indexOutOfBoundsException, , транзакция не закрыта и некоторое время остается открытой.

Можно ли как-то принудительно закрыть транзакцию в таком случае?

1 Ответ

2 голосов
/ 14 февраля 2011

Если я что-то пропустил, вы, вероятно, хотите что-то вроде:

em.getTransaciton().begin();
try {
  Query query = em.createNativeQuery("DELETE FROM table1 WHERE theId = 10;");
  query.executeUpdate(); //not yet executed until transaction is commited.

  //continue do something...

  em.getTransaction().commit(); //the query above is executed here finally
} catch (ex RuntimeException) {
  em.getTransaction().rollback();
} finally {
  // you probably also want something here to check the status of the transaction and rollback if you exited the try block somehow
}

Тем не менее, я считаю, что для менеджера транзакций обычно выполняется откат при сбое фиксации, но, похоже, это не происходит для вас.

Кроме того, полагаться на запрос на обновление для выполнения при фиксации не очень хорошая идея, поскольку Hibernate может решить запустить ваше обновление в любое время (по сути, делая flush ()). Если вы хотите выполнить запрос в самом конце, сделайте это прямо перед фиксацией.

...