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