37

EJB3 ステートレス セッション Bean で CMT を使用しています。また、「@ApplicationException (rollback=true)」という注釈を持つ独自の例外を作成しました。

  1. トランザクションをロールバックしたい場合、「context.setRollbackOnly()」を使用する必要がありますか?

  2. Bean の public メソッド内で例外をスローして、トランザクションをロールバックすることはできますか?

  3. その場合 (Q#2 への答えは「はい」)、メソッドで例外を宣言してメソッドから例外をスローする必要がありますか、それともメソッド内で例外をスローして同じメソッド内で処理するだけで十分ですか?自体?(例外を次のレベルに伝播させたくありません。例外をロールバックしたいだけです。)

前もって感謝します。;)

4

2 に答える 2

77

まず、例外のロールバックはなく、トランザクションのロールバックです。

  1. で例外をスローした場合@ApplicationException(rollback=true)、トランザクションを手動でロールバックする必要はありません。Context.setRollbackOnly()例外がない場合も、コンテナーに強制的にトランザクションをロールバックさせます。
  2. チェックされた例外自体は、トランザクションをロールバックしません。注釈が必要@ApplicationException(rollback=true)です。例外が aRuntimeExceptionで、例外がキャッチされない場合、コンテナーは強制的にトランザクションをロールバックします。ただし、注意してください。この場合、コンテナーは EJB インスタンスを破棄します。
  3. 2.) で述べたように、 をスローするRuntimeExceptionと、トランザクションは自動的にロールバックされます。コード内でチェック例外をキャッチした場合はsetRollbackOnly、トランザクションをロールバックするために使用する必要があります。

詳細については、無料の書籍Mastering EJBを参照してください。ロールバックのシナリオについて詳しく説明しており、無料でダウンロードできます

于 2010-03-02T11:56:17.420 に答える
0

スロー時にロールバックが発生するようにアノテーションで宣言されたチェック済み例外が「上位層」に伝播されないようにする方法の問題は、ここではまだ回答されていません。

これには、スローされた例外を飲み込む問題の EJB のラッパーが必要になると思います。(つまり、カスタム例外はメソッド境界に対してスローされなければならず (したがって、メソッド内でキャッチおよび処理されない)、トランザクション効果を得るために伝播されなければならないと思います。また、EJB インスタンスの破壊も引き起こします。)

于 2013-05-15T13:18:14.067 に答える