Java 从hibernate配置创建EntityManagerFactory
在我们当前的应用程序(JavaSE)中,我们使用特定于Hibernate的API,但我们有点想在任何可能的地方(但速度较慢)迁移到JPA。为此,我需要Java 从hibernate配置创建EntityManagerFactory,java,hibernate,jpa,entitymanager,sessionfactory,Java,Hibernate,Jpa,Entitymanager,Sessionfactory,在我们当前的应用程序(JavaSE)中,我们使用特定于Hibernate的API,但我们有点想在任何可能的地方(但速度较慢)迁移到JPA。为此,我需要EntityManagerFactory,而不是SessionFactory(我希望这是一条毫无争议的公理) 问题是,目前我们的会话工厂是从org.hibernate.cfg.Configuration创建的,我想暂时保留它,因为这个配置通过我们软件的不同部分传递,这些部分可以并且确实可以根据需要配置持久性 因此,问题是:我如何才能 Service
EntityManagerFactory
,而不是SessionFactory
(我希望这是一条毫无争议的公理)
问题是,目前我们的会话工厂是从org.hibernate.cfg.Configuration
创建的,我想暂时保留它,因为这个配置通过我们软件的不同部分传递,这些部分可以并且确实可以根据需要配置持久性
因此,问题是:我如何才能
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings( hibConfiguration.getProperties() )
.buildServiceRegistry();
SessionFactory sessionFactory = hibConfiguration.buildSessionFactory( serviceRegistry );
等效的结果是
EntityManagerFactory
?这非常简单。不过,您需要一个persistence.xml
,您已经为JPA定义了一个持久化单元。然后必须将Hibernate属性转换为映射
,以便将它们传递给方法。这将为您提供使用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;
}
最后一部分应该使用unwrap()方法,而不是显式强制转换。我认为这是可行的,但不幸的是,这没有提供注册的实体:/I注定要使用persistence.xml文件,其中指定了实体:/。这就是我的意思:“您将需要persistence.xml,因为您已经为JPA定义了一个持久性单元。”。你必须告诉JPA哪些实体需要持久化。你解决了这个问题吗?你的解决方案是什么?完全转向JPA——这比我们提出的任何中间解决方案都要简单。啊哈,所以我想你当时没有使用hibernate拦截器,对吧?我有一个问题似乎没有得到任何答案:
public SessionFactory getSessionFactory(EntityManagerFactory entityManagerFactory) {
return ((EntityManagerFactoryImpl) entityManagerFactory).getSessionFactory();
}