在 Web 应用程序(jsp/servlets)中获取 EntityManagerFactory 的最佳方法是什么? 这是一个好方法吗When should EntityManagerFactory instance be created/opened? , 还是从 JNDI 或其他地方获取它更好?
最佳答案
它们是重量级的,它们应该在应用程序范围内。因此,您需要在应用程序启动时打开它们,并在应用程序关闭时关闭它们。
如何做到这一点取决于您的目标容器。它是否支持 EJB 3.x(Glassfish、JBoss AS 等)?如果是这样,那么如果您只是使用 @PersistenceContext
在 EJB 中执行 JPA 工作,那么您根本不需要担心打开/关闭它们(与事务无关)。常规方式:
@Stateless
public class FooService {
@PersistenceContext
private EntityManager em;
public Foo find(Long id) {
return em.find(Foo.class, id);
}
// ...
}
如果您的目标容器不支持 EJB(例如 Tomcat、Jetty 等)和像 OpenEJB 这样的 EJB 插件由于某种原因也不是一个选项,因此您手动摆弄创建 EntityManager
s(和交易),那么你最好的选择是 ServletContextListener
.这是一个基本启动示例:
@WebListener
public class EMF implements ServletContextListener {
private static EntityManagerFactory emf;
@Override
public void contextInitialized(ServletContextEvent event) {
emf = Persistence.createEntityManagerFactory("unitname");
}
@Override
public void contextDestroyed(ServletContextEvent event) {
emf.close();
}
public static EntityManager createEntityManager() {
if (emf == null) {
throw new IllegalStateException("Context is not initialized yet.");
}
return emf.createEntityManager();
}
}
(注意:在 Servlet 3.0 之前,该类需要由 <listener>
在 web.xml
中注册,而不是 @WebListener
)
可以用作:
EntityManager em = EMF.createEntityManager();
// ...
关于java - 获取 EntityManagerFactory 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862700/