从休眠配置创建 EntityManagerFactory

Posted

技术标签:

【中文标题】从休眠配置创建 EntityManagerFactory【英文标题】:Creating EntityManagerFactory from hibernate Configuration 【发布时间】:2015-07-19 10:17:00 【问题描述】:

在我们当前的应用程序 (Java SE) 中,我们使用 Hibernate 特定的 API,但我们希望尽可能地迁移到 JPA(但速度较慢)。为此,我需要EntityManagerFactory 而不是SessionFactory(我想毫无争议地保持这一公理)。

问题出在哪里,目前我们的会话工厂是从org.hibernate.cfg.Configuration 创建的,我想暂时保留它 - 因为这个配置是通过我们软件的不同部分传递的,这些部分可以并且确实配置他们想要的坚持。

所以问题是:我该怎么做

ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                                   .applySettings( hibConfiguration.getProperties() )
                                   .buildServiceRegistry();
SessionFactory sessionFactory = hibConfiguration.buildSessionFactory( serviceRegistry );

等价于EntityManagerFactory?

【问题讨论】:

这个问题你解决了吗?你的解决方案是什么? 完全迁移到 JPA - 这比我们提出的任何中间解决方案都容易。 啊哈,所以我想你没有使用休眠拦截器,对吧?我有这个问题似乎没有得到任何答案:***.com/questions/32696237/… 【参考方案1】:

这很简单。不过,您将需要一个persistence.xml,您已在其中为 JPA 定义了一个持久性单元。然后您必须将 Hibernate 属性转换为Map,这样您就可以将它们传递给createEntityManagerFactory 方法。这将使用您的 Hibernate 属性为您提供EntityManagerFactory

public EntityManagerFactory createEntityManagerFactory(Configuration hibConfiguration) 
    Properties p = hibConfiguration.getProperties();

    // convert to Map
    Map<String, String> pMap = new HashMap<>();
    Enumeration<?> e = p.propertyNames();
    while (e.hasMoreElements()) 
        String s = (String) e.nextElement();
        pMap.put(s, p.getProperty(s));
    

    // create EntityManagerFactory
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("some persistence unit", pMap);

    return emf;
   

如果您需要EntityManagerFactory 中的SessionFactory(反之亦然),则可以使用此方法:

public SessionFactory getSessionFactory(EntityManagerFactory entityManagerFactory) 
    return ((EntityManagerFactoryImpl) entityManagerFactory).getSessionFactory();

【讨论】:

最后一部分应该使用 unwrap() 方法而不是显式转换。 我认为它有效,但不幸的是,这不提供已注册的实体:/ 我注定要使用带有指定实体的 persistence.xml 文件:/。 这就是我的意思:“不过,您需要一个 persistence.xml,在其中为 JPA 定义了一个持久性单元。”。您必须以某种方式告诉 JPA 哪些实体要持久化。

以上是关于从休眠配置创建 EntityManagerFactory的主要内容,如果未能解决你的问题,请参考以下文章

在休眠配置文件中设置 HSQLDB 数据类型?

如何为 mysqlcluster 创建休眠配置文件?

休眠的动态类

Elastic Beanstalk (AWS) 的休眠配置

休眠:创建索引

使用 findAll() 方法时如何避免休眠创建抽象类的对象?