Java EE 7 を使用しています。アプリケーション スコープのCDI Beanに JPAEntityManager
を挿入する適切な方法を知りたいです。インスタンスはスレッドセーフではないため、アノテーションを使用して注入することはできません。すべての HTTP リクエスト処理の開始時に作成され、HTTP リクエストが処理された後に閉じられると仮定しましょう。2つのオプションが頭に浮かびます:@PersistanceContext
EntityManager
EntityManager
1. への参照を持つ要求スコープの CDI Bean を作成し、EntityManager
その Bean をアプリケーション スコープの CDI Bean に注入します。
import javax.enterprise.context.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@RequestScoped
public class RequestScopedBean {
@PersistenceContext
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
}
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
@ApplicationScoped
public class ApplicationScopedBean {
@Inject
private RequestScopedBean requestScopedBean;
public void persistEntity(Object entity) {
requestScopedBean.getEntityManager().persist(entity);
}
}
この例でEntityManager
は、 が作成されると が作成され、が破棄さRequestScopedBean
れると が閉じられます。RequestScopedBean
これで、インジェクションを抽象クラスに移動して、ApplicationScopedBean
.
2. のインスタンスを生成するプロデューサを作成し、そのインスタンスをアプリケーション スコープの CDI Bean にEntityManager
注入します。EntityManager
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
public class EntityManagerProducer {
@PersistenceContext
@Produces
@RequestScoped
private EntityManager entityManager;
}
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
@ApplicationScoped
public class ApplicationScopedBean {
@Inject
private EntityManager entityManager;
public void persistEntity(Object entity) {
entityManager.persist(entity);
}
}
この例ではEntityManager
、HTTP リクエストごとに作成される もありますが、 ?を閉じるのはどうでしょうか。EntityManager
HTTP リクエストが処理された後も閉じられますか? @PersistanceContext
アノテーションが container-managed を注入することは知っていEntityManager
ます。これはEntityManager
、クライアント Bean が破棄されると が閉じられることを意味します。この状況でのクライアント Bean とは何ですか? ApplicationScopedBean
アプリケーションが停止するまで決して破棄されない ですか、それともEntityManagerProducer
ですか? 何かアドバイスはありますか?
アプリケーション スコープ Bean の代わりにステートレス EJB を使用して、EntityManager
アノテーション@PersistanceContext
で注入できることはわかっていますが、それは重要ではありません :)