2015-05-08 17 views
7

Trong ứng dụng hiện tại của chúng tôi (Java SE), chúng tôi sử dụng Hibernate API cụ thể, nhưng chúng tôi muốn di chuyển đến JPA bất cứ khi nào có thể (nhưng chậm). Đối với điều đó, tôi cần EntityManagerFactory thay vì SessionFactory (và tôi muốn giữ nguyên điều này mà không có tranh chấp).Tạo EntityManagerFactory từ cấu hình ngủ đông

Vấn đề ở đâu, hiện tại nhà máy của chúng tôi đang được tạo từ org.hibernate.cfg.Configuration và tôi muốn giữ nó như hiện tại - vì cấu hình này được chuyển qua các phần khác nhau của phần mềm của chúng tôi. như họ muốn.

Vì vậy, câu hỏi là: làm thế nào tôi có thể làm

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

tương đương kết quả EntityManagerFactory?

+0

Bạn giải quyết vấn đề này? Giải pháp của bạn là gì? –

+0

chuyển sang JPA hoàn toàn - dễ dàng hơn bất kỳ giải pháp trung gian nào mà chúng tôi đã đưa ra. – psychollek

+0

Aha, vì vậy tôi cho rằng bạn không sử dụng một kẻ đánh chặn ngủ đông sau đó, phải không? Tôi có câu hỏi này mà dường như không thu hút bất kỳ câu trả lời nào: http://stackoverflow.com/questions/32696237/jpa-with-hibernate-5-programmatically-create-entitymanagerfactory –

Trả lời

2

Điều này khá đơn giản. Bạn sẽ cần một persistence.xml mặc dù, nơi bạn đã xác định một đơn vị kiên trì cho JPA. Sau đó, bạn phải chuyển đổi các thuộc tính Hibernate thành Map, vì vậy bạn có thể chuyển chúng đến phương thức createEntityManagerFactory. Điều này sẽ cung cấp cho bạn các EntityManagerFactory bằng cách sử dụng tài sản Hibernate của bạn.

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

Nếu bạn cần SessionFactory từ EntityManagerFactory (cách khác xung quanh), sau đó bạn có thể sử dụng phương pháp này:

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

Phần cuối cùng nên sử dụng phương thức unwrap() chứ không phải là truyền rõ ràng. –

+0

Tôi nghĩ rằng nó hoạt động, nhưng unfortunatelly điều này không cung cấp các thực thể đăng ký:/Tôi đang cam chịu cho persistence.xml tập tin với các thực thể quy định: /. – psychollek

+0

Đó là những gì tôi muốn nói: * "Bạn sẽ cần một tệp persistence.xml, trong đó bạn đã xác định một đơn vị bền vững cho JPA." *. Bạn bằng cách nào đó phải nói cho JPA biết các thực thể nào tồn tại. – MicSim

Các vấn đề liên quan