2015-05-08 3 views
7

В нашем текущем приложении (Java SE) мы используем API-интерфейс Hibernate, но мы как бы хотим перейти на JPA, где это возможно (но медленно). Для этого мне нужно EntityManagerFactory вместо SessionFactory (и я хотел бы сохранить эту аксиому без споров).Создание EntityManagerFactory из конфигурации спящего режима

Проблема в том, что в настоящее время наша фабрика сеансов создается с org.hibernate.cfg.Configuration, и я хотел бы сохранить ее так же, как сейчас, поскольку эта конфигурация передается через разные части нашего программного обеспечения, которые могут и могут настраивать постоянство как они хотят.

Таким образом, вопрос: как я могу сделать

ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() 
            .applySettings(hibConfiguration.getProperties()) 
            .buildServiceRegistry(); 
SessionFactory sessionFactory = hibConfiguration.buildSessionFactory(serviceRegistry); 

эквивалент в результате EntityManagerFactory?

+0

ли вы решить эту проблему? Каково было ваше решение? –

+0

полностью перешел на JPA - это было проще, чем любые промежуточные решения, с которыми мы столкнулись. – psychollek

+0

Ага, так что, полагаю, вы не используете перехватчик спящего режима, верно? У меня есть этот вопрос, который, похоже, не вызывает никаких ответов: http://stackoverflow.com/questions/32696237/jpa-with-hibernate-5-programmatically-create-entitymanagerfactory –

ответ

2

Это довольно просто. Вам понадобится persistence.xml, хотя вы определили единицу для сохранения JPA. Затем вам нужно преобразовать свойства Hibernate в Map, чтобы вы могли передать их методу createEntityManagerFactory. Это даст вам EntityManagerFactory, используя свойства Hibernate.

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(); 
} 
+1

В последней части должен использоваться метод unwrap() а не явное литье. –

+0

Я думал, что это работает, но, к сожалению, это не предоставляет зарегистрированные объекты:/Я обречен на файлы persistence.xml с указанными объектами: /. – psychollek

+0

Вот что я имел в виду: * «Вам понадобится persistence.xml, хотя вы определили блок персистентности для JPA». *. Вы как-то должны сказать JPA, какие сущности должны сохраняться. – MicSim

Смежные вопросы