Hibernate no es un buen ciudadano OSGi ya que muchas de las suposiciones que Hibernate hace sobre la visibilidad de clase ya no son ciertas en un contenedor OSGi.
La forma habitual de cargar los controladores JDBC con Class.forName(<jdbc class name>)
no funciona dentro de OSGi porque, en este caso, Hibernate intentará cargar el controlador pero no lo encontrará ya que Hibernate no (y no debería) importar el paquete de controladores JDBC.
El administrador de controladores JDBC también intenta ser inteligente al determinar si el cargador de clases de la clase llamante debe ver el controlador y esto también entra en conflicto con OSGi.
Si utiliza Spring para configurar Hibernate, le sugiero que use la clase SimpleDriverDataSource
ya que esto funciona en OSGi y Spring le permite configurar Hibernate con una fuente de datos concreta en lugar de pasar un nombre de clase que Hibernate necesita para crear instancias.
Una vez que supere ese problema, probablemente se encuentre con el problema de que Hibernate no vea sus clases de dominio. Solo tengo experiencia con el enfoque de mapeo XML, creo que es más simple en OSGi ya que creo que las anotaciones requieren un tipo de AOP de algún tipo y ese es otro punto de dolor actual con OSGi. Por el momento, a menos que use algo como Spring's dm Server, necesitará familiarizarse mucho más con el mecanismo de carga de clases de Java y cómo puede usar el enfoque de OSGi para evitar las incompatibilidades entre Java y OSGi. mundo.
Específicamente, investigue cómo las bibliotecas empresariales usan el cargador de clases de contexto y cómo puede gestionarlo. Estoy utilizando Spring dm para ajustar el código heredado en los servicios OSGi, ya que esto facilita el control del cargador de clases de contexto.
, pero no puedo ver cómo el paquete de hibernación nunca encontrará la JDBC-controlador correcto y sin explícitamente importando, por ej. org.embedded.derby u org.mysql.jdbc .. –
¿tiene las fuentes de su paquete de hibernación? Eche un vistazo al manifiesto y vea cuál es la clase de activador. Luego mira esta clase y probablemente responderá a tu pregunta – paweloque
"Hibernate entonces probablemente busca un controlador por su interfaz, no es necesario importar clases específicas de controladores". ¿Eso significa que el paquete de Hibernate tiene alguna API para configurar un controlador JDBC específico? (por ejemplo, establecer mysql-jdbc, establecer oracle-jdbc, etc. de lo contrario no puedo ver cómo hibernate obtiene el controlador correcto) –