2010-07-13 8 views
6

Mi chiedo un buon modo per avere un EntityManager in ogni pacchetto. O come usare correttamente JPA in un programma OSGi.Eclipselink: come si ottiene EntityManager in ogni pacchetto?

In realtà, ho un fascio principale che carica il file persistence.xml e crea un'istanza del EntityManager. Successivamente, il mio bundle principale fornisce l'istanza di Entity Manager agli altri bundle tramite i servizi. Quindi uso la potenza dei servizi di equinozio e sono sicuro che deve esistere un'altra soluzione per ottenere un EntityManager in ogni pacchetto!

Conosci un'altra soluzione? o un modo corretto per raggiungere questo obiettivo?

risposta

3

Avete dato un'occhiata agli esempi JPA OSGi sulla wiki EclipseLink: http://wiki.eclipse.org/EclipseLink/Examples/OSGi

EclipseLink è confezionato e progettato per lavorare in OSGi. E prossimamente è Eclipse Gemini JPA che aggiunge il supporto per l'utilizzo di EclipseLink attraverso il nuovo standard OSGA JPA (www.eclipse.org/gemini/jpa, Stackoverflow non mi consente di postare l'URL completo). Penso che ti piacerebbe Gemini JPA come la spec è molto orientata al servizio e un EntityManagerFactory può essere ottenuto tramite servizi da qualsiasi pacchetto. Stiamo lavorando per una pietra miliare iniziale per Gemini JPA, quindi per ora rimango con EclispeLink OSGi.

--Shaun

+0

Grazie. Tuttavia, il sito che mi hai dato non descrivono come avere in ogni fascio un'istanza di EntityManager ... Potrebbe aiutarmi? O fammi un esempio? Molte grazie – user376112

3

Se si scrive un'applicazione desktop (e quindi non hanno accesso al contenitore gestisce la persistenza), vi suggerisco di pubblicare l'EntityManageFactory come un servizio, e non l'EntityManager. Il tuo codice avrà quindi questo layout:

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

E nel tuo attivatore:

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

Spero che questo contribuisce a dare un'idea.

Problemi correlati