从hibernate配置创建EntityManagerFactory

psy*_*lek 7 java hibernate jpa sessionfactory entitymanager

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

问题出在哪里,目前我们的会话工厂正在创建org.hibernate.cfg.Configuration,我想暂时保留它 - 因为这个配置通过我们软件的不同部分传递,可以并且可以根据需要配置持久性.

所以问题是:我该怎么做

ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                                   .applySettings( hibConfiguration.getProperties() )
                                   .buildServiceRegistry();
SessionFactory sessionFactory = hibConfiguration.buildSessionFactory( serviceRegistry );
Run Code Online (Sandbox Code Playgroud)

相当于导致EntityManagerFactory

Mic*_*Sim 3

这非常简单。不过,您将需要一个persistence.xml为 JPA 定义持久性单元的地方。然后您必须将 Hibernate 属性转换为 a 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;
}   
Run Code Online (Sandbox Code Playgroud)

如果您需要来自SessionFactoryEntityManagerFactory相反),那么您可以使用此方法:

public SessionFactory getSessionFactory(EntityManagerFactory entityManagerFactory) {
    return ((EntityManagerFactoryImpl) entityManagerFactory).getSessionFactory();
}
Run Code Online (Sandbox Code Playgroud)

  • 最后一部分应该使用 unwrap() 方法而不是显式转换。 (2认同)