Java 从hibernate配置创建EntityManagerFactory

Java 从hibernate配置创建EntityManagerFactory,java,hibernate,jpa,entitymanager,sessionfactory,Java,Hibernate,Jpa,Entitymanager,Sessionfactory,在我们当前的应用程序(JavaSE)中,我们使用特定于Hibernate的API,但我们有点想在任何可能的地方(但速度较慢)迁移到JPA。为此,我需要EntityManagerFactory,而不是SessionFactory(我希望这是一条毫无争议的公理) 问题是,目前我们的会话工厂是从org.hibernate.cfg.Configuration创建的,我想暂时保留它,因为这个配置通过我们软件的不同部分传递,这些部分可以并且确实可以根据需要配置持久性 因此,问题是:我如何才能 Service

在我们当前的应用程序(JavaSE)中,我们使用特定于Hibernate的API,但我们有点想在任何可能的地方(但速度较慢)迁移到JPA。为此,我需要
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();
}