EntityManagerの初期化のベストプラクティス
-
21-09-2019 - |
質問
EntityManager
を使用している場合、それはPersistenceContext
で1つのインスタンスを取得し、私のプログラムでそれを周りに渡すために優れている、または私はそれ以上?
私のアプリケーションでは、各クライアントは、ステートフルセッションBeanと通信し、各Beanは、いくつかの点で使用EntityManager
する必要があります。
私は、Beanのメソッドを同時にinvocatedている(しかし、私もよく分からない)ことを推測します。
どのように私は、スレッドセーフな方法でEntityManager
を使用することを保証していますか?取引では?各Beanに別々のインスタンスと
申し訳ありませんが、私は、EJB / JPAに新たなんだと私は私の質問に対処する任意の材料を見つけることができませんでした。
解決
はい、あなたは(少なくともではない別のクライアントから同時に呼び出されません)あなたのステートフルセッションBeanに(各スレッド/クライアント要求ごとに異なります)EntityManager
インスタンスを注入する必要があります。
が、DAOクラスを作成しても意味がありません。 JPAはすでに、あなたは別のJPA実装間の独立性と可搬性をRDBMS与え、高レベルの永続化APIです。だから、DAOをのみをコードベースに混乱を追加することになります。
取引について、あなたは本当に何もする必要はありません。彼らは常に、クライアント固有のトランザクション内で実行されますので、セッションBeanのビジネスメソッドは、デフォルトでは「必須」トランザクション属性を持っています。
他のヒント
を使用するには、あなたのDAOクラス(ES)でご@PersistenceContext
を注入するEntityManager
。これらは、データベース操作を処理するクラスです。次に、あなたのDAOクラス(ES)注入、他の全ての(サービス)のクラスインチあなたのDAOはステートレスBeanにする必要があります(リモートインタフェースの必要がなく、ローカルのみ)