1

我正在使用带有单个持久性单元的 OpenJPA 2.0。

在我的 persistence.xml 中,我选择了transaction-type="RESOURCE_LOCAL"手动配置和管理事务。

现在,在下面的代码中,如果 aPersistenceException被抛出(并被捕获),我应该如何清理事务?

    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

4

1 回答 1

2

是的,有以下通知:根据文档,它可能会抛出一个IllegalStateException. 另外,我想您在应用程序服务器端,这就是为什么我会考虑下一个通知:

或者,您可以切换回 JTA,使用 Bean-Managed-Transaction 自行管理 JTA 事务并使用UserTransaction

@Resource private UserTransaction userTransaction;
于 2013-09-06T08:55:57.707 回答