首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取EntityManagerFactory的最佳实践

获取EntityManagerFactory的最佳实践
EN

Stack Overflow用户
提问于 2011-10-23 05:23:47
回答 1查看 40.4K关注 0票数 23

在web应用程序(jsp/servlets)中获取EntityManagerFactory的最佳方法是什么?这是一种很好的When should EntityManagerFactory instance be created/opened?方式,还是从JNDI或其他什么地方获取它更好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-23 05:41:00

它们是重量级的,应该在应用范围内。因此,您需要在应用程序启动时打开它们,并在应用程序关闭时关闭它们。

如何做到这一点取决于你的目标容器。它是否支持EJB3.x (Glassfish、JBoss AS等)?如果是这样,那么你根本不需要担心打开/关闭它们(也不是事务),如果你只需要用@PersistenceContext来做EJB中的JPA工作:

代码语言:javascript
复制
@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。这是一个基本的启动示例:

代码语言:javascript
复制
@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中注册,而不是在中注册)

它可以用作:

代码语言:javascript
复制
EntityManager em = EMF.createEntityManager();
// ...
票数 65
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7862700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档