Java PersistenceException之后清理打开的事务的正确方法是什么?
我将OpenJPA2.0与单个持久化单元一起使用 在my persistence.xml中,我选择使用配置Java PersistenceException之后清理打开的事务的正确方法是什么?,java,transactions,persistence,openjpa,Java,Transactions,Persistence,Openjpa,我将OpenJPA2.0与单个持久化单元一起使用 在my persistence.xml中,我选择使用配置transaction type=“RESOURCE\u LOCAL”并手动管理事务 现在,在下面的代码中,如果抛出(并捕获)一个PersistenceException,我应该如何清理事务 try { entityManager.getTransaction().begin(); MyClassPO myClassPO = (MyClassPO) e
transaction type=“RESOURCE\u 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);
}
我知道事务没有被自动清除,因为下次运行同一操作时,我会收到错误消息当事务处于活动状态时,无法执行此操作。
它是否像放入
entityManager.getTransaction().rollback()一样简单在catch
块中的code>?是,注意如下:
根据,它可能抛出一个非法状态异常
。另外,我想你在应用服务器端,这就是为什么我会考虑下一个注意事项:
或者,您可以切换回JTA,使用Bean管理的事务自己管理JTA事务,并使用
好的,谢谢。关于IllegalStateException
,在执行回滚之前,我是否需要检查getTransaction().isActive()
是否为true?在您的示例中,我不会检查,因为很少有事务无法激活的情况。也许我会检查逻辑是否在不同的类之间出现(但不是您的情况)。
@Resource private UserTransaction userTransaction;