2010-07-13 18 views
6

Her Bundle'da bir EntityManager'a sahip olmanın iyi bir yolunu merak ediyorum. Ya da bir OSGi programında doğru JPA nasıl kullanılır.Eclipselink: EntityManager'ı her bir pakete nasıl alırsınız?

Aslında, persistence.xml dosyasını yükleyen ve EntityManager'ı başlatan bir ana paketim var. Sonra, ana paketim, diğer gruplar için hizmetlerle Entity yöneticisinin örneğini verir. Bu nedenle, ekinoks hizmetlerinin gücünü kullanıyorum ve eminim ki her bir pakette bir EntityManager almak için başka bir çözüm bulunması gerekiyor!

Başka bir çözüm biliyor musunuz? veya bunu başarmak için doğru bir yol?

cevap

3

Eğer EclipseLink wiki JPA OSGi örneklere göz attınız mı: http://wiki.eclipse.org/EclipseLink/Examples/OSGi

EclipseLink için paketlenir ve OSGi çalışmak üzere tasarlanmıştır. Yakında Eclipse Gemini JPA, EclipseLink'i yeni OSGi JPA standardıyla destekliyor (www.eclipse.org/gemini/jpa, Stackoverflow tam URL'yi göndermeme izin vermiyor). Gemini JPA'nın, çok servis odaklı olduğunu ve herhangi bir paketten hizmetler yoluyla bir EntityManagerFactory alınabileceğini düşünüyorum. Gemini JPA için ilk bir dönüm noktasına doğru çalışıyoruz, bu yüzden şimdi EclispeLink OSGi ile yapıştıracağım.

--Shaun

+0

Teşekkürler. Ancak, bana verdiğiniz web sitesi her bir pakette bir EntityManager örneğinin nasıl oluşturulacağını açıklamıyor ... Bana yardımcı olabilir misiniz? Ya da bana bir örnek ver? Çok teşekkürler – user376112

3

sen (kalıcılığını konteyner yönetir erişimi yoktur dolayısıyla ve) bir masaüstü uygulaması yazıyorsanız, size bir hizmet değil, EntityManager olarak EntityManageFactory yayımlamak düşündürmektedir.

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

Ve aktivatör içinde: Bu size bir fikir vermek için yardımcı olur

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

Umut Kodunuz sonra bu düzen olacaktır.

İlgili konular