Я использую 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
блоке?
ОК, спасибо. в отношении 'IllegalStateException' - мне нужно проверить, является ли' getTransaction(). isActive() 'истинно, прежде чем выполнять откат? – vikingsteve
В вашем примере я бы не стал проверять, так как действительно мало случаев, когда транзакция не может быть активной. Может быть, я бы проверял, существует ли логика между разными классами (но не ваш случай). –
Хорошо, спасибо вам снова andrei. – vikingsteve