2011-08-02 9 views
2

テストアプリケーションでCDIを試しています。CDI @ Beanのトランザクション属性

@Named 
@SessionScoped 
public class TestController implements Serializable { 
    @Inject 
    private TestDAO testDAO; 

    public void finishGame() { 
     testDAO.insertEntity(new Test(1, 2, 3)); 
    } 
} 

私はこれを実行すると、私はエラーが表示されます。

public class TestDAO implements Serializable { 
    @PersistenceContext 
    private EntityManager entityManager; 

    public void insertEntity(Test test) { 
     entityManager.persist(test); 
    } 
} 

は今、私はこのようなCDIコントローラーBeanを持っている:私は、コンテナは、このようなJTA永続コンテキストを管理注入DAOを持っていますDAOアクティブなトランザクションが利用できないため、エンティティを挿入しようとしています。ここまでは順調ですね。コントローラのBeanにトランザクションでfinishGame()をラップするステートフルなEJBを作成することで、これを解決できます。

しかし、私はEJBを望まないと仮定しましょう。テストとして、finishGame()@TransactionAttribute注釈を付けると、それが機能しました(コントローラビーンはEJBではありません)。だから私の質問は:どのように動作するのですか? CDIはプレーン豆のために@TransactionAttributeを定義していますか?私はSeam Persistence Moduleがこれをしていることを知っていますが、私はそれを使用していません。実際に私はそれをプロジェクトに追加しましたが、私は厄介な例外を受けたので、後に削除しました。

誰でも私の混乱を解消できますか?実際にCDIはプレーンな豆のために@TransactionAttributeを定義しますか?

P.S.私は別の種類の質問があります。私は、すべてのEJBアノテーションをプレーンなBeanに移植する傾向があることを知っています。それではEJBsは今後廃止されるのでしょうか?私はJIRAで、@TransactionAttributeが未処理の豆のために将来追加されることを見た(タスクはまだ解決されない)。このように、EJBを一新するわけではありません。

敬具、あなたがトランザクションインターセプタを定義行う必要 ペタル

答えて

2

。基本的に@Transactionalアノテーションを定義し、アノテーションを付けられたすべてのメソッドをインターセプトします。インターセプタでは、トランザクションを開始、コミットまたはロールバックするだけです。トランザクションの伝播が絵になると、より複雑になります。 Seamにすぐに使用できるものがないかどうかを確認してください。http://seamframework.org/Seam3/PersistenceModule

+0

+1、有益な回答ありがとう!しかし、私の疑問は '@ TransactionAttribute'が何もせずにプレーンな' CDI' beanで動作した理由です。私はいつも '@ TransactionAttribute'は' EJBs 'に対してのみ機能すると考えてきました。 –

+0

はい、私はそうだと思います。@TransactionAttributeはすぐに使えないはずです – Bozho

+0

それは奇妙なことです。十分な時間があれば、単純な 'CDI'アプリケーションを作成して、' @ TransactionAttribute'が普通の 'CDI'ビーンで動作するかどうか試してみてください。それは私がそれが普通の豆で動作してはならないことを知っているので私を狂って運転しています... –

関連する問題