2010-07-13 27 views
6

Tôi tự hỏi về cách tốt để có một EntityManager trong mỗi Gói. Hoặc cách sử dụng đúng JPA trong chương trình OSGi.Eclipselink: Làm thế nào để bạn có được EntityManager trong mỗi gói?

Thực ra, tôi đã có một gói chính tải tệp persistence.xml và khởi tạo EntityManager. Sau đó, gói chính của tôi cung cấp cá thể trình quản lý Entity cho các gói khác thông qua các dịch vụ. Vì vậy, tôi sử dụng sức mạnh của các dịch vụ của equinox và tôi chắc chắn nó phải tồn tại một giải pháp khác để có được một EntityManager trong mỗi gói!

Bạn có biết giải pháp khác không? hoặc một cách chính xác để đạt được điều này?

Trả lời

3

Bạn đã lấy một cái nhìn vào các ví dụ JPA OSGi trên wiki EclipseLink: http://wiki.eclipse.org/EclipseLink/Examples/OSGi

EclipseLink được đóng gói cho và được thiết kế để làm việc trong OSGi. Và sắp tới là Eclipse Gemini JPA bổ sung hỗ trợ cho việc sử dụng EclipseLink thông qua tiêu chuẩn OSGi JPA mới (www.eclipse.org/gemini/jpa, Stackoverflow sẽ không cho phép tôi đăng URL đầy đủ). Tôi nghĩ rằng bạn muốn Gemini JPA như spec là rất dịch vụ theo định hướng và một EntityManagerFactory có thể thu được thông qua các dịch vụ từ bất kỳ gói. Chúng tôi đang làm việc hướng tới một mốc quan trọng ban đầu cho Gemini JPA vì vậy bây giờ tôi muốn gắn bó với EclispeLink OSGi.

--Shaun

+0

Cảm ơn. Tuy nhiên, trang web mà bạn đã cung cấp cho tôi không mô tả cách có trong mỗi gói một bản sao của EntityManager ... Bạn có thể giúp tôi không? Hoặc cho tôi một ví dụ? Rất cám ơn – user376112

3

Nếu bạn đang viết một ứng dụng máy tính để bàn (và do đó không có quyền truy cập vào container quản lý bền bỉ), tôi đề nghị bạn xuất bản các EntityManageFactory như một dịch vụ, và không phải là EntityManager. Mã của bạn sau đó sẽ có cách bố trí này:

public void someBusinessMethod() { 
    EntityManager em = Activator.getEntityManager(); 
    try { 
    ... 
    } finally { 
    em.close(); 
    } 
} 

Và trong activator của bạn:

public class Activator 
    implements BundleActivator { 
    private static ServiceTracker emfTracker; 

    public void start(BundleContext context) { 
    emfTracker = new ServiceTracker(context, EntityManagerFactory.class.getCanonicalName(),null); 
    emftracker.open(); 
    } 

    public void stop(BundleContext context){ 
    emfTracker.close(); 
    emfTracker = null; 
    } 

    public static EntityManager getEntityManager() { 
    return ((EntityManagerFactory)emfTracker.getService()).createEntityManager(); 
    } 
} 

Hope this helps để cung cấp cho bạn một ý tưởng.

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