テストアプリケーションで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を一新するわけではありません。
敬具、あなたがトランザクションインターセプタを定義行う必要 ペタル
+1、有益な回答ありがとう!しかし、私の疑問は '@ TransactionAttribute'が何もせずにプレーンな' CDI' beanで動作した理由です。私はいつも '@ TransactionAttribute'は' EJBs 'に対してのみ機能すると考えてきました。 –
はい、私はそうだと思います。@TransactionAttributeはすぐに使えないはずです – Bozho
それは奇妙なことです。十分な時間があれば、単純な 'CDI'アプリケーションを作成して、' @ TransactionAttribute'が普通の 'CDI'ビーンで動作するかどうか試してみてください。それは私がそれが普通の豆で動作してはならないことを知っているので私を狂って運転しています... –