2015-05-08 17 views
7

W naszej obecnej aplikacji (Java SE) używamy specyficznego interfejsu Hibernate API, ale chcielibyśmy przeprowadzić migrację do JPA wszędzie tam, gdzie to możliwe (ale powoli). W tym celu potrzebuję EntityManagerFactory zamiast SessionFactory (i chciałbym zachować ten aksjomat bez sporów).Tworzenie EntityManagerFactory z konfiguracji hibernacji

Gdzie jest problem, że obecnie nasza fabryka sesji jest tworzona z org.hibernate.cfg.Configuration i chciałbym ją zachować tak jak na razie - ponieważ ta konfiguracja jest przekazywana przez różne części naszego oprogramowania, które mogą i konfigurują utrwalanie jak chcą.

Więc pytanie brzmi: w jaki sposób mogę dokonać

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

równoważne powodując EntityManagerFactory?

+0

Czy rozwiązać ten problem? Jakie było twoje rozwiązanie? –

+0

przeprowadzka do JPA całkowicie - to było łatwiejsze niż jakiekolwiek pośrednie rozwiązania, które wymyśliliśmy. – psychollek

+0

Aha, więc przypuszczam, że nie używasz przechwytywacza hibernacji, prawda? Mam pytanie, które nie wydaje się przyciągać żadnych odpowiedzi: http://stackoverflow.com/questions/32696237/jpa-with-hibernate-5-programmatically-create-entitymanagerfactory –

Odpowiedz

2

Jest to dość proste. Będziesz jednak potrzebował persistence.xml, w którym zdefiniowałeś jednostkę utrwalania dla JPA. Następnie musisz przekonwertować właściwości Hibernate na Map, aby można było przekazać je do metody createEntityManagerFactory. Zapewni to EntityManagerFactory przy użyciu właściwości Hibernuj.

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; 
} 

Jeśli potrzebujesz SessionFactory z EntityManagerFactory (na odwrót), to można użyć tej metody:

public SessionFactory getSessionFactory(EntityManagerFactory entityManagerFactory) { 
    return ((EntityManagerFactoryImpl) entityManagerFactory).getSessionFactory(); 
} 
+1

Ostatnia część powinna być za pomocą metody unwrap() zamiast wyraźnego rzucania. –

+0

Myślałem, że to działa, ale niestety nie dostarcza zarejestrowanych podmiotów:/Jestem skazany na pliki persistence.xml z podanymi podmiotami: /. – psychollek

+0

To właśnie miałem na myśli przez: * "Musisz jednak mieć plik persistence.xml, w którym zdefiniowałeś jednostkę utrwalającą dla WZP." *. W jakiś sposób musisz powiedzieć WZP, które jednostki mają się utrzymywać. – MicSim

Powiązane problemy