2010-07-13 10 views
6

Je m'interroge sur un bon moyen d'avoir un EntityManager dans chaque Bundle. Ou comment utiliser correctement JPA dans un programme OSGi.Eclipselink: Comment obtenez-vous l'EntityManager dans chaque paquet?

En fait, j'ai un paquet principal qui charge le fichier persistence.xml et instancie l'EntityManager. Après, mon bundle principal donne l'instance de Entity Manager aux autres bundles via les services. J'utilise donc la puissance des services d'équinoxe et je suis sûr qu'il doit exister une autre solution pour obtenir un EntityManager dans chaque bundle!

Connaissez-vous une autre solution? ou une façon correcte d'y parvenir?

Répondre

3

Avez-vous pris un regard sur les exemples JPA OSGi sur le wiki EclipseLink: http://wiki.eclipse.org/EclipseLink/Examples/OSGi

EclipseLink est emballé et conçu pour fonctionner dans OSGi. Et bientôt, Eclipse Gemini JPA ajoutera du support pour l'utilisation d'EclipseLink via le nouveau standard JPA OSGi (www.eclipse.org/gemini/jpa, Stackoverflow ne me laisse pas afficher l'URL complète). Je pense que vous aimeriez Gemini JPA car la spécification est très orientée service et une entité EntityManagerFactory peut être obtenue via les services de n'importe quel bundle. Nous travaillons actuellement sur un premier jalon pour Gemini JPA. Pour l'instant je resterais avec EclispeLink OSGi.

--Shaun

+0

Merci. Cependant, le site que vous m'avez donné ne décrit pas comment avoir dans chaque paquet une instance de EntityManager ... Pourriez-vous m'aider? Ou donnez-moi un exemple? Merci beaucoup – user376112

3

Si vous écrivez une application de bureau (et donc n'ont pas accès à conteneur gère la persistance), je vous suggère de publier le EntityManageFactory en tant que service, et non l'EntityManager. Votre code sera alors cette mise en page:

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

Et dans votre activateur:

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 pour vous donner une idée.

Questions connexes