它们是重量级的,应该在应用程序范围内。因此,您需要在应用程序启动时将其打开,并在应用程序关闭时将其关闭。
该如何做取决于您的目标容器。它是否支持EJB3.x(Glassfish,JBossAS等)?如果是这样,那么如果您只用
@PersistenceContext通常的方式在EJB中执行JPA工作,那么您根本就不必担心打开/关闭它们(与事务无关):
@Statelesspublic class FooService { @PersistenceContext private EntityManager em; public Foo find(Long id) { return em.find(Foo.class, id); } // ...}如果您的目标容器不支持EJB(例如Tomcat,Jetty等),并且由于某种原因也无法选择像OpenEJB这样的EJB附加组件,那么您就
EntityManager自己动手创建了(和事务),那么你最好的选择是
ServletContextListener。这是一个
基本的 启动示例:
@WebListenerpublic 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>
inweb.xml
代替来注册@WebListener
)
可以用作:
EntityManager em = EMF.createEntityManager();// ...



