【问题标题】:Best practice to get EntityManagerFactory获取 EntityManagerFactory 的最佳实践
【发布时间】:2011-12-13 08:16:18
【问题描述】:

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

【问题讨论】:

    标签: java jpa jndi


    【解决方案1】:

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

    如何做到这一点取决于您的目标容器。它是否支持 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 插件也不是一个选项,因此您需要手动摆弄创建 @987654327 @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();
    // ...
    

    【讨论】:

    • 一如既往的优秀示例,但只是想补充一点,当使用没有“unitName”属性的@PersistenceContext 时,它暗示(以非声明性方式)使用定义的唯一/默认持久性单元在“persistence.xml”中。如果有多个数据源/持久性单元,则可能会导致混淆这是哪一个。
    • 不确定还缺少什么,我按照您的回答进行操作,但出现运行时错误? > 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义类型 [javax.persistence.EntityManagerFactory] ​​的唯一 bean:预期单个 bean,但发现 0:
    • @huahsin68:最初的问题根本不涉及 Spring,我也不做 Spring。只需按“”。
    • 你能给出Persistence类的全名吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2012-11-11
    相关资源
    最近更新 更多