0

私はJavaEE/JPAにかなり慣れていないので、プロジェクトで次のニーズに直面しました。これを達成する方法をしばらく探していましたが、これまでのところ成功していません。私の間違い、そしてうまくいけば、正しい解決策がどのように機能するかを教えてください。動作するコードの一部をコピーするのではなく、学ぶことができます。

問題:

Bean内に、3つの異なるJPA永続メソッド(1つの永続メソッドと2つのマージ)を呼び出すメソッドがありますが、これらの永続メソッドの1つ以上が失敗した場合、トランザクション全体をロールバックできることを確認する必要があります。問題。

これは、私のBeanがどのように見えるかのスクラッチです。

@Stateless(mappedName = "FuncionarioBean")
@Remote(FuncionarioBeanRemote.class)
@TransactionManagement(TransactionManagementType.BEAN)//Was instructed to put this annotation, but I don't know the real impact of it in my application if it was set as a CONTAINER.
public class FuncionarioBean implements FuncionarioBeanRemote {

    @PersistenceContext
    private EntityManager em;

    @Resource
    private UserTransaction utx;

    @Override
    public void updateFuncionario(FuncionarioEntity funcionarioEditado) {

        try{
            utx.begin();
            /* irrelevant code */
            callJPAMergeMethod1();
            /* irrelevant code */
            callJPAMergeMethod2();
            /* irrelevant code */
            callJPACreateMethod1();
            /* irrelevant code */
            utx.commit();
        } catch (Exception e) {
            utx.rollback();
        }
    }
}

例外が発生することを確認するために、更新/マージする要素の1つをnull(列はNOT NULL)に設定していますが、いくつかの不明な理由(少なくとも私にとっては)のために、例外はスローされず、他のメソッドは引き続き実行されます実行されました。UserTransactionメソッドを削除して@TransationManagementアノテーションを削除すると、例外がスローされますが、メソッド全体をロールバックする方法はありません。

ここで私が間違っていることを教えてもらえますか?

すべての助けを事前に感謝します。

よろしくお願いします、

エンリコベルガモ。

4

2 に答える 2

0

@TransactionManagementこの目的には必要ありません。

コンテナーは、次の場合にロールバックします。

  • システム例外
  • @ApplicationException で注釈が付けられた (未) チェック済み例外

EE コンテナが対応している場合にスローされます。たとえば、NullPointerException はシステム例外ではなく未チェックの例外であるため、ロールバックは通常ここでは提供されません。

于 2012-12-11T11:09:15.027 に答える