java - 获取 EntityManagerFactory 的最佳实践

标签 java jpa jndi

在 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/

相关文章:

java - JNDI/LDAP 的陈旧套接字连接泄漏

java - 你能让一个图像按钮像android中的位图一样移动吗

java - 如何使用 JPA 验证模型数据?

java - JDBC和JNDI代码解释Java EE

对连接表的 JPA 查询

Hibernate/JPA @AttributeOverrides 与 Groovy 不能很好地配合

java - 使用 JNDI 作为我的数据源和属性文件的位置

java - Nifi GCPCredentialsControllerService : java. lang.NoClassDefFoundError:com/google/api/client/http/HttpTransport

java - 在局部变量上同步是否合理?

java - Java中的类型转换也会引起内存字节的转换吗?