从休眠配置创建 EntityManagerFactory
Posted
技术标签:
【中文标题】从休眠配置创建 EntityManagerFactory【英文标题】:Creating EntityManagerFactory from hibernate Configuration 【发布时间】:2015-07-19 10:17:00 【问题描述】:在我们当前的应用程序 (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
?
【问题讨论】:
这个问题你解决了吗?你的解决方案是什么? 完全迁移到 JPA - 这比我们提出的任何中间解决方案都容易。 啊哈,所以我想你没有使用休眠拦截器,对吧?我有这个问题似乎没有得到任何答案:***.com/questions/32696237/… 【参考方案1】:这很简单。不过,您将需要一个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;
如果您需要EntityManagerFactory
中的SessionFactory
(反之亦然),则可以使用此方法:
public SessionFactory getSessionFactory(EntityManagerFactory entityManagerFactory)
return ((EntityManagerFactoryImpl) entityManagerFactory).getSessionFactory();
【讨论】:
最后一部分应该使用 unwrap() 方法而不是显式转换。 我认为它有效,但不幸的是,这不提供已注册的实体:/ 我注定要使用带有指定实体的 persistence.xml 文件:/。 这就是我的意思:“不过,您需要一个 persistence.xml,在其中为 JPA 定义了一个持久性单元。”。您必须以某种方式告诉 JPA 哪些实体要持久化。以上是关于从休眠配置创建 EntityManagerFactory的主要内容,如果未能解决你的问题,请参考以下文章