2013-09-06 2 views
1

Я использую OpenJPA 2.0 с одним модулем непрерывности.Каков правильный способ очистки открытой транзакции после PersistenceException?

В моем persistence.xml Я решил пойти с конфигурацией transaction-type="RESOURCE_LOCAL" и управлять транзакциями вручную.

Теперь, в приведенном ниже коде, если PersistenceException получает брошен (и поймал), как я должен очистить транзакцию?

try { 
     entityManager.getTransaction().begin(); 
     MyClassPO myClassPO = (MyClassPO) entityManager 
       .createQuery("select bn from myClassPO bn where bn.xxx = :xxx") 
       .setParameter("xxx", xxx) 
       .getSingleResult(); // NoResultException gets thrown here 

     ... do some more stuff ... 

     entityManager.getTransaction().commit(); 

    } catch (PersistenceException e) { 

     // what should I do with the open transaction here ?? 

     logger.error(e); 
     throw new MyOtherException(e); 
    } 

Я знаю, что сделка не получает очищается автоматически, так как в следующий раз я бегу ту же операцию, я получаю сообщение об ошибке This operation cannot be performed while a Transaction is active.

Это так же просто, как положить entityManager.getTransaction().rollback(); в catch блоке?

ответ

2

Да, со следующим уведомлением: в соответствии с documentation, он может выбрасывать IllegalStateException. Кроме того, я полагаю, что вы находитесь на стороне Application Server, и именно поэтому я бы рассмотрел следующее уведомление:

В качестве альтернативы вы можете переключиться на JTA, самостоятельно управлять транзакцией JTA с Bean-Managed-Transaction и использовать UserTransaction

@Resource private UserTransaction userTransaction; 
+0

ОК, спасибо. в отношении 'IllegalStateException' - мне нужно проверить, является ли' getTransaction(). isActive() 'истинно, прежде чем выполнять откат? – vikingsteve

+0

В вашем примере я бы не стал проверять, так как действительно мало случаев, когда транзакция не может быть активной. Может быть, я бы проверял, существует ли логика между разными классами (но не ваш случай). –

+0

Хорошо, спасибо вам снова andrei. – vikingsteve

Смежные вопросы