Java PersistenceException之后清理打开的事务的正确方法是什么?

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

我将OpenJPA2.0与单个持久化单元一起使用

在my persistence.xml中,我选择使用配置
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;