从休眠配置创建 EntityManagerFactory

Creating EntityManagerFactory from hibernate Configuration

在我们当前的应用程序 (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?

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

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();
}