使用 CDI 在 Java EE 应用程序中获取对 EntityManager 的引用
我使用的是Java EE 7。我想知道将 JPA 注入应用程序范围的 CDI Bean 的正确方法是什么。您不能只使用注释来注入它,因为实例不是线程安全的。假设我们希望在每个HTTP请求处理的开始时创建我们的,并在处理HTTP请求后关闭。我想到了两个选项:EntityManager
@PersistanceContext
EntityManager
EntityManager
1. 创建一个请求范围的 CDI Bean,其中包含对 的引用,然后将该 Bean 注入到应用程序范围的 CDI Bean 中。EntityManager
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);
}
}
在此示例中,将在创建 时创建 a,并在 销毁时关闭。现在,我可以将注入移动到某个抽象类中,以将其从 .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);
}
}
在这个例子中,我们还将有一个每个HTTP请求都创建的,但是关闭?在处理 HTTP 请求后,它是否也会被关闭?我知道注释注入了容器管理的。这意味着当客户端 Bean 被销毁时,将会关闭 。在这种情况下,什么是客户端 Bean?是 在应用程序停止之前永远不会被销毁,还是 ?有什么建议吗?EntityManager
EntityManager
@PersistanceContext
EntityManager
EntityManager
ApplicationScopedBean
EntityManagerProducer
我知道我可以使用无状态EJB而不是应用程序范围的bean,然后通过注释注入,但这不是重点:)EntityManager
@PersistanceContext