从hibernate配置

时间:2015-05-08 13:16:12

标签: java hibernate jpa entitymanager sessionfactory

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

1 个答案:

答案 0 :(得分:2)

这非常简单。但是,您需要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;
}   

如果您需要SessionFactory中的EntityManagerFactory(反过来),那么您可以使用此方法:

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