私は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
アノテーションを削除すると、例外がスローされますが、メソッド全体をロールバックする方法はありません。
ここで私が間違っていることを教えてもらえますか?
すべての助けを事前に感謝します。
よろしくお願いします、
エンリコベルガモ。