在web应用程序(jsp/servlets)中获取EntityManagerFactory的最佳方法是什么?这是一种很好的When should EntityManagerFactory instance be created/opened?方式,还是从JNDI或其他什么地方获取它更好?
发布于 2011-10-23 05:41:00
它们是重量级的,应该在应用范围内。因此,您需要在应用程序启动时打开它们,并在应用程序关闭时关闭它们。
如何做到这一点取决于你的目标容器。它是否支持EJB3.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);
}
// ...
}
如果您的目标容器不支持EntityManager
(例如,Tomcat、Jetty等),并且由于某种原因,像OpenEJB这样的EJB附加组件也不是一个选项,那么您就需要自己手动创建EJB(和事务),那么您最好的选择就是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();
}
}
(注意:Servlet3.0之前,这个类需要由<listener>
在web.xml
中注册,而不是在中注册)
它可以用作:
EntityManager em = EMF.createEntityManager();
// ...
https://stackoverflow.com/questions/7862700
复制相似问题