2010-07-13 15 views
6

Me pregunto acerca de una buena manera de tener un EntityManager en cada paquete. O cómo usar JPA correctamente en un programa OSGi.Eclipselink: ¿Cómo se obtiene EntityManager en cada paquete?

En realidad, tengo un paquete principal que carga el archivo persistence.xml y crea una instancia del EntityManager. Después, mi paquete principal da la instancia del administrador de la entidad a los otros paquetes a través de los servicios. Entonces uso el poder de los servicios de Equinox y estoy seguro de que debe existir otra solución para obtener un EntityManager en cada paquete.

¿Conoces alguna otra solución? o una forma correcta de lograr esto?

Respuesta

3

¿Ha echado un vistazo a los ejemplos APP OSGi en el wiki EclipseLink: http://wiki.eclipse.org/EclipseLink/Examples/OSGi

EclipseLink se empaqueta para y diseñado para trabajar en OSGi. Y próximamente está Eclipse Gemini JPA, que agrega soporte para usar EclipseLink a través del nuevo estándar OSGi JPA (www.eclipse.org/gemini/jpa, Stackoverflow no me deja publicar la URL completa). Creo que le gustaría Gemini JPA ya que la especificación está muy orientada al servicio y se puede obtener una EntityManagerFactory a través de los servicios de cualquier paquete. Estamos trabajando para lograr un hito inicial para Gemini JPA, así que por ahora me quedaría con EclispeLink OSGi.

--Shaun

+0

Gracias. Sin embargo, el sitio web que me diste no describe cómo tener en cada paquete una instancia de EntityManager ... ¿Podrías ayudarme? ¿O dame un ejemplo? Muchas gracias – user376112

3

Si está escribiendo una aplicación de escritorio (y por lo tanto no tienen acceso a los contenedores-gestiona persistencia), sugiero que se publica el EntityManageFactory como un servicio, y no el EntityManager. Su código tendrá entonces este diseño:

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

Y en su activador:

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

Esperanza esto ayuda a dar una idea.

Cuestiones relacionadas