3

JPA toplink-essential を使用して、REST Web アプリを構築しています。

1 つのエンティティを見つけて削除するサーブレットがあります。

以下のコードでは、サーブレット レベルで楽観的ロック例外をキャッチできると思っていましたが、そうではありません! 代わりに RollbackException がスローされ、それがドキュメントの内容です:

しかし、Netbean IDE GlassFish ログを見ると、どこかで optimisticLockException がスローされます。私のコードに引っかからないだけです。(私のシステムの印刷メッセージは表示されないので、そこに入っていないと確信しています。)

各パッケージを (もちろん一度に 1 つずつ) インポートしようとし、catch 句でテストしましたが、どちらの場合も、ログ エラーに「楽観的例外」と表示されていても、catch ブロックには入りません。

import javax.persistence.OptimisticLockException;
import oracle.toplink.essentials.exceptions.OptimisticLockException;

では、OptimisticLockException がスローされる場所はどこですか?????

@Path("delete")
@DELETE
@Consumes("application/json")
public Object planDelete(String content) {

   try {
            EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();

            EntityTransaction txn = em.getTransaction();
            txn.begin();
            jObj = new JSONObject(content);
            MyBeany bean = em.find(123);

            bean.setVersion(Integer.parseInt(12345));
            em.remove(bean);


            //here commit!!!!!
            em.getTransaction().commit(); 
        }
        catch(OptimisticLockException e) {  //this is not caught here :(
            System.out.pritnln("here");
            //EntityTransactionManager.rollback(txn);
            return HttpStatusHandler.sendConflict();
        }
        catch(RollbackException e) {
            return HttpStatusHandler.sendConflict();
        }
        catch(Exception e) {
            return HttpStatusHandler.sendServerError(e);
        }
        finally {
            if(em != null) {
                em.close();
            }
        }

エラー メッセージ:

[TopLink Warning]: 2011.01.28 05:11:24.007--UnitOfWork(22566987)
--Exception [TOPLINK-5006] 
(Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): 
oracle.toplink.essentials.exceptions.OptimisticLockException

    [TopLink Warning]: 2011.02.01 08:50:15.095--UnitOfWork(681660)--
javax.persistence.OptimisticLockException: Exception [TOPLINK-5006] (Oracle TopLink 
Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): 
oracle.toplink.essentials.exceptions.OptimisticLockException
4

3 に答える 3

3

100%確実ではありませんが、javax.persistence.OptimisticLockException(パッケージに注意)をキャッチしている可能性がありますが、スローされた例外はoracle.toplink.essentials.exceptions.OptimisticLockExceptionであるため、キャッチされていませんか?例外クラスの名前は同じですが、同じクラスではありません。

于 2011-01-28T18:16:12.533 に答える
2

em.getTransaction().commit();ステートメントにスローされていると思い ます。

RollbackExceptionの Java ドキュメントに次のように記載されているためです。

EntityTransaction.commit() が失敗したときに永続化プロバイダーによってスローされます。

これはあなたが実際に使用するコードではないと強く信じています ( ) が行にないためコンパイルされません)bean.setVersion(Integer.parseInt(12345);が、実際のコードに同じ問題があることを「願っています」。

于 2011-01-28T08:39:59.350 に答える
1

entityManager.flush(); を呼び出してみましたか? あなたのtry/catchブロックの中に?JPA がフラッシュするのは、OptimisticLock 例外がスローされるときです。

また、トランザクションをコミットする必要はありません。単純に txn.commit(); を実行できたはずです。em.getTransaction().commit(); の代わりに。

javax.persistence.OptimisticLockException をキャッチできる同様の状況があります。私の場合、ReST エンドポイントを SSB にし、エンティティ マネージャーを挿入しました。次に、別の SSB でメソッドを呼び出します。この SSB も注入され、このビジネス ロジックのコントローラーとして機能します。このコントローラーは、flush() を実行し、OLEX をキャッチして再スローし、Rest エンドポイント / SSB がキャッチして再試行する ApplicationException をキャッチします。このパターンを使用すると、OLEX が古いトランザクションを無効にするため、再試行するたびに新しいトランザクションが発生するように、TransactionAttributeType.RequiresNew を指定する必要もあります。

于 2011-08-22T17:44:44.123 に答える