0

プロジェクトを 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()機能します。なんで?

アプリケーション管理とコンテナ管理の両方で常に機能するべきではありませんか?

4

1 に答える 1

1

わかりましたので、CDI Bean をトランザクション対応にすることができます - インターセプターを使用:-)

最後に、この記事を読んで問題を解決することができました。

http://smokeandice.blogspot.com/2009/12/cdi-and-declarative-transactions.html

編集:

JEE7 から@Transactional、CDI Bean またはメソッドのすべての JPA アクションをトランザクションに取り込む新しいアノテーションがあります。

于 2013-04-23T22:50:48.350 に答える