获取 EntityManagerFactory 的最佳实践
在web app(jsp/servlets)中获取EntityManagerFactory的最佳方法是什么?这是一个好方法,什么时候应该创建/打开EntityManagerFactory实例?或者从JNDI获取它还是其他东西更好?
在web app(jsp/servlets)中获取EntityManagerFactory的最佳方法是什么?这是一个好方法,什么时候应该创建/打开EntityManagerFactory实例?或者从JNDI获取它还是其他东西更好?
他们是重量级的,他们应该在应用范围内。因此,您需要在应用程序启动时打开它们,并在应用程序关闭时关闭它们。
如何执行此操作取决于目标容器。它是否支持EJB 3.x(Glassfish,JBoss AS等)?如果是这样,那么如果您只是在EJB中以通常的方式@PersistenceContext 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附加组件由于某种原因也不是一个选项,因此你因此需要自己手动设置创建(和事务),那么你最好的选择是ServletContextListener
。下面是一个基本的启动示例:EntityManager
@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();
// ...