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 に答える