プロジェクトを Seam 3 から移動しようとしています。
Seam Faces モジュールをオフにした後、JTA トランザクションでスタックしてしまいました。統合されたトランザクション管理がありました。手動コミットなしで、トランザクションが開始され、自動的にコミットされます。
EntityManager.persist()
orを実行しようとするとEntityManager.merge(Object entity)
、エラーが発生します。
JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context)
JTA に強制的にトランザクションを開始させ、透過的にコミットさせる方法はありますか?
Ps。面白いことに、少し前に Seam3 で手動コミット/ロールバックを強制する方法を探していました。
OK、Bean を @Stateless 状態にすると、予想どおりに動作します。
しかし...
アプリケーション管理の EntityManager を配置する場合は、自分でトランザクションを管理する必要がありますが (testApplicationJTA()
以下の例のメソッド)、コンテナー管理の EntityManager を使用する場合は、トランザクション管理 (メソッドtestContainterJTA()
) なしで動作するはずです。
私の例:
@Named
@SessionScoped
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
@PersistenceContext
private EntityManager em;
@PersistenceUnit
private EntityManagerFactory emf;
@Resource
private UserTransaction utx;
public void testContainerJTA() {
TestEntity entity = em.find(TestEntity.class, 1L);
entity.setName("dddddd");
em.merge(entity);
}
public void testApplicationJTA() {
EntityManager mgr = emf.createEntityManager();
TestEntity entity = em.find(TestEntity.class, 1L);
entity.setName("fffff");
try {
utx.begin();
mgr.joinTransaction();
mgr.merge(dict);
utx.commit();
} catch (Exception e) {
utx.rollback();
}
mgr.close();
}
}
上記の私の例では、メソッド testContainerJTA() は機能しません。なんで?
削除@SessionScoped
して配置すると@Stateless
、メソッドtestApplicationJTA()
は機能しませんが、testContainerJTA()
機能します。なんで?
アプリケーション管理とコンテナ管理の両方で常に機能するべきではありませんか?