2009-03-19 11 views
8

En lugar de tener acciones de base de datos dispersas en cuatro paquetes (osgi), todas hacen cosas ligeramente diferentes. Quiero crear un paquete OSGi (simple) que sea responsable de todos los problemas de persistencia. Siento que esto no es tan simple como parece debido al asunto del "cargador de clases único por paquete". Entonces, lo que realmente agradecería es que alguien sepa la (s) solución (es) a este tipo de problema.OSGi + Hibernate

Respuesta

4

(Si está utilizando anotaciones de Hibernate)

Guardar todos los cargadores de clases entidades cuando el haz de Hibernate es informado sobre una clase anotada.

Luego haga algo como esto antes de construir su SessionFactory.

ClassLoad cl = Thread.currentThread().getContextClassLoader(); 
try { 
Thread.currentThread().setContextClassLoader(yourClassLoader); 
factory = cfg.buildSessionFactory(); 
}finally { 
Thread.currentThread().setContextClassLoader(cl); // restore the original class loader 
} 
5

Hay dos maneras en que puedo pensar para resolver el problema de la carga de clases.

  • ¿Está vinculado a un OSGi-Framework específico, o desea mantenerse lo más compatible posible? ¿O puedes usar Equinox para tu implementación? En Equinox tienes un mecanismo llamado Buddy Classloading. Esta adición le permite aumentar la visibilidad de ciertas clases entre diferentes OSGi-Bundles. Si está interesado en este tema, me gustaría dirigirlo a estos dos artículos: Understanding how Eclipse plug-ins work with OSGi, Eclipse - a tale of two VMs (and many classloaders).
  • Si prefiere permanecer independiente de la implementación de OSGi, puede considerar extraer sus clases, que desea persistir, en un paquete separado del que dependen Hibernate-Bundle y sus otros paquetes. De esta forma, todos tienen acceso a la definición de clase de las clases persistentes.
1

Acabo de encontrar un método interesante en la clase Bundle/api.

public java.lang.Class loadClass(java.lang.String name) throws java.lang.ClassNotFoundException 

¿Esto debe resolver algunos problemas con la carga de clases?

1

voy a recomendar a permanecer lejos de compañero de carga de clases, ya que es específico para Eclipse aplicación Equinox y, en mi opinión, la gente conseguir que funcione pero no entiendo por qué y todo el mundo termina como un amigo de todos los demás. Esto le impide obtener una comprensión adecuada de cómo funciona la carga de clases OSGi y los patrones que necesita usar (cargadores de clases compuestas, carga de clase de contexto, servicios OSGi, ...) para trabajar con ella.

Si su paquete de persistencia sabe de antemano qué tipos necesita para persistir, entonces el paquete puede importar todos los paquetes requeridos (Require-Bundle is evil) que contienen sus clases de dominio.

Administrar el cargador de clases de contexto (como en la respuesta de Roger) puede ayudar con Hibernate, aunque sugeriría usar algo como Spring dm para ocultarlo detrás de un servicio OSGi.