我正在使用Java EE 7.我想知道将JPA EntityManager
注入应用程序范围的 CDI bean 的正确方法是什么.您不能只使用@PersistanceContext
注释注入它,因为EntityManager
实例不是线程安全的.假设我们希望EntityManager
在每个HTTP请求处理的开始时创建我们,并在处理HTTP请求后关闭它们.我想到了两个选择:
1.创建一个请求范围的CDI bean,它具有对a的引用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;
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,EntityManager
将在创建时RequestScopedBean
创建,并在RequestScopedBean
销毁时关闭.现在我可以将注入移动到一些抽象类中以将其从中删除ApplicationScopedBean
.
2.创建一个生成实例的生产者,EntityManager
然后将EntityManager
实例注入到应用程序范围的CDI bean中.
import …
Run Code Online (Sandbox Code Playgroud)