2017-06-08 11 views
0

私はDAOクラスを作成し、このクラスの中でEntityManagerを使用して永続操作を実行しようとしていました。 私のデータベースは、persistence.xmlのjta-data-sourceとして定義され、それに応じてWebアプリケーションサーバーにデータソースとして登録されます。JPAトランザクションはEJB内にバインドされていますか?

トランザクションが必要なので、DAO内のEntityManagerのem.persist()メソッドを使用するときに問題が発生します。明らかに、UserTransactionという特別なタイプのトランザクションでなければなりません。私はあなたが@Resource UserTransaction utx;

でこのトランザクションを注入することができます。しかし仕事への注入のために、私のDAOクラスがEJB(@Stateless)することにより、コンテナによって初期化されなければならないことを見つけるウェブの例を検索する

。私のDAOをコンテナ管理することで、DAOクラスを自由に手動で初期化することができなくなります。

DAOクラス内でEJBを作成せずにトランザクションを作成するにはどうすればよいですか? UserTransactionのJNDIを手動で調べなければなりませんか?

答えて

0

JavaEEでは、あなたのDAOは本当にコンテナ(サーバ)によって管理されるべきです。 Java EE仕様で指定されているように、管理対象コンポーネントのみがリソースおよびコンテキストにフルアクセスできます。たとえば、1回の呼び出しで多数のコンポーネントが単一のトランザクションを共有できるため、サーバーはそれらのコンポーネントのライフサイクルを管理し、その状態を制御する必要があります。
DAOに@Statelessで注釈を付けると、ステートレスセッションBean(デフォルトではトランザクションを意識したEJB Bean)になります。たとえば、CDI + @Transactionalとすることができますが、EJBは実際にはデータアクセス層の理想的なビルディングブロックです。
公式のJavaEEチュートリアルを読んでみたり、tons of JavaEE sample projectsを見て、JavaEEの開発方法を理解してください。

関連する問題