我遇到了一个令人沮丧的问题.我使用Apache Felix作为我的OSGi框架,我也使用Hibernate来解决持久性问题.
我正在使用Hibernate的"osgi-bundle"版本(com.springsource.org.hibernate-3.2.6.ga.jar).据我所知,这是Hibernate Core,在META-INF/MANIFEST.mf中安装了一些额外的osgi-metdata.这些信息(Package-Export和Package-Import)对osgi系统至关重要.
我的问题是Hibernate包找不到我的JDBC驱动程序.将Import语句添加到springsource Hibernate包中感觉非常错误.必须有一些更好的方法来解决这个问题.
Hibernate并不是一个非常好的OSGi公民,因为Hibernate在类可见性上做出的许多假设在OSGi容器中已不再适用.
加载JDBC驱动程序的常用方法Class.forName(
在OSGi中不起作用,因为在这种情况下,Hibernate将尝试加载驱动程序但不会找到它,因为Hibernate不会(也不应该)导入JDBC驱动程序包.
JDBC驱动程序管理器也试图通过确定调用类的类加载器是否应该看到驱动程序来实现智能,这也与OSGi冲突.
如果您使用Spring配置Hibernate,那么我建议您使用SimpleDriverDataSource
该类,因为它在OSGi中工作,Spring允许您使用具体数据源配置Hibernate,而不是传递Hibernate需要实例化的类名.
一旦你解决了这个问题,你可能会遇到Hibernate没有看到你的域类的问题.我只有XML映射方法的经验,我认为在OSGi中更简单,因为我认为注释方式需要某种AOP编织,这是OSGi的另一个当前痛点.
目前,除非你使用像Spring的dm Server这样的东西,否则你需要更熟悉Java的类加载机制,以及如何使用OSGi的服务方法来解决vanilla Java和OSGi世界之间的不兼容问题.
具体来说,了解企业库如何使用上下文类加载器以及如何管理它.我使用Spring dm在OSGi服务中包装遗留代码,因为这样可以轻松控制上下文类加载器.