Pregunta

En lugar de tener acciones de la base de datos dispersas en cuatro paquetes (osgi), todos 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 a & Quot; cargador de clases único por paquete & Quot; cosa. Entonces, lo que realmente agradecería es que alguien conozca las soluciones para este tipo de problema.

¿Fue útil?

Solución

(Si está utilizando anotaciones de Hibernate)

Guarde todos los cargadores de clases de Entidades cuando el paquete Hibernate sea 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
}

Otros consejos

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

  • ¿Estás vinculado a un OSGi-Framework específico, o quieres seguir siendo lo más compatible posible? ¿O puede usar equinoccio para su 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: Comprender cómo funcionan los complementos de Eclipse con OSGi , Eclipse - una historia de dos máquinas virtuales (y muchos cargadores de clases) .
  • Si prefiere mantenerse independiente de la implementación de OSGi, puede considerar extraer sus clases, que desea persistir, en un paquete separado del que dependen tanto el paquete Hibernate-Bundle como sus otros paquetes. De esa forma, todos tienen acceso a la definición de clase de las clases persistentes.

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

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

¿Esto debe resolver algunos problemas del cargador de clases?

Voy a recomendar que se mantenga alejado de la carga de clases de amigos, ya que es específico de la implementación de Equinox de Eclipse y, en mi opinión, las personas lo hacen funcionar, pero no entienden por qué y todos terminan siendo amigos de todos má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 compuestos, carga de clases de contexto, servicios OSGi, ...) para trabajar con ellos.

Si su paquete de persistencia sabe de antemano qué tipos necesita para persistir, entonces el paquete puede importar todos los paquetes requeridos (Require-Bundle es malo) 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 ocultar eso detrás de un servicio OSGi.

Hibernate admite OSGi pero es un esfuerzo continuo .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top