これは、私が現在抱えているアーキテクチャの問題です。プロジェクトで EJB と JPA を統合するベスト プラクティスについてサポートが必要です。アプリケーションのビジネス ロジックを含む、サービス層のジョブを実行する EJB が必要です。そのすぐ下に、EJB が DAO ファクトリを使用してこれら 2 つのレイヤーを可能な限り分離するハンドルを持つ DAO レイヤーが必要です。それを知っているので、DAOをEJBとして作成することは明らかにできません。これは、工場で作成したいので、自動的に注入したくないからです。これにより、entitymanager を手動で作成することになります。
Persistence.createEntityManagerFactory("PortalEJB").createEntityManager();
さて...この呼び出しは私の抽象的なJPA DAOにあります:
public abstract class JPADataAccessorObject<K, E> implements DataAccessorObject<K, E> {
protected Class<E> entityClass;
protected EntityManager entityManager;
protected JPADataAccessorObject(Class<E> pEntityClass) {
this.entityManager = Persistence.createEntityManagerFactory("PortalEJB").createEntityManager();
this.entityClass = pEntityClass;
}
/* Other DAO functions (update, delete, create) */
}
これはまずいと思いますね。このクラスのすべての具体的なエクステントには、永続化コンテキストの新しいコピーが含まれ、奇妙な動作が発生します。また、そうするとサービス層でトランザクションを自分で管理しなければならないと思います。そのためのアスペクトを作成しようとしていました。
- サービス層の関数/手順の前にトランザクションを作成する
- (例外が発生した場合はトランザクションをロールバックします)
- サービス層の関数/手順の後にトランザクションをコミットします
だからここに私の質問があります:
- EntityManager はどのように管理すればよいですか?
- マルチスレッドから保護された 1 つのコピーを持つように管理する、ある種の JPA ユーティリティ クラスが必要ですか?
- ひどい間違いを犯している場合は、ベスト プラクティスを提供してください。