我遇到了一个令人沮丧的问题。 我使用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 bundle无法找到我的JDBC驱动程序。将Import语句添加到springsource Hibernate包中感觉非常错误。必须有一些更好的方法来解决这个问题。
答案 0 :(得分:7)
Hibernate不是一个非常好的OSGi公民,因为Hibernate在类可见性上做出的许多假设在OSGi容器中不再适用。
使用Class.forName(<jdbc class name>)
加载JDBC驱动程序的常用方法在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服务中,因为这样可以很容易地控制上下文类加载器。
答案 1 :(得分:3)
您是否正在处理正确的捆绑包开始订购?有一种方法可以设置每个包的启动级别,以便您的系统可以正确引导。如果某些激活器试图直接获取服务,则可能需要正确的捆绑包启动级别。如果服务不可用,服务消费者将被卡住。
尝试为捆绑包设置正确的启动级别,看看它是否有效。具体而言,您必须首先在hibernate bundle之前使用JDBC驱动程序启动bundle。
另一个问题可能是您有一些未解决的依赖项。确保所有东西都在那里。您可以通过获取OSGi控制台并要求提供服务列表来完成此操作。在Equinox中,这归结为-console命令行参数和“ss”,后跟OSGi shell中的“diag”命令。
编辑(回答你的评论):
驱动程序由其界面注册。然后Hibernate可能通过其界面查找驱动程序,无需导入特定的驱动程序类。无论如何,这会对特定于实现的类引入不期望的依赖。
答案 2 :(得分:3)
在OSGi包中,您只能看到已导入的包中的类和资源。 Hibernate包不会(也不应该)导入您的域类。因此,当Hibernate尝试处理XML映射文件时,它会抱怨它无法找到正在映射的类(您的域类)。
我们通过使用Equinox的伙伴策略解决了这个问题,因此每个提供域对象的bundle都是Hibernate的类加载伙伴。我不太喜欢这种方法,但我没有时间写出(希望)优雅的解决方案。
正如我在之前的文章中所说,操纵上下文类加载器可能是Hibernate最好的长期投注。
答案 3 :(得分:1)
我前段时间遇到过similar problem。解决方案是将jdbc-provider bundle和jdbc-user bundle注册为“伙伴”。这是因为一个bundle不能在没有明确声明的情况下使用另一个bundle(所以jdbc驱动程序也是如此)。这是针对Eclipse的,所以我认为它可以帮助你。
答案 4 :(得分:1)
我没有尝试过这个(因为我是反RDBMS,因此反ORM),但是一个解决方案可能是使用OSGi片段。
创建一个包含域类的片段,并将Hibernate bundle指定为主机。此片段应导出域类的包。
同样,您可以对要使用的JDBC驱动程序执行相同的操作。获取驱动程序类并将其转换为OSGi片段,并将Hibernate作为主机包。但是,您不必导出驱动程序包,因为它们只会被Hibernate包使用。
我怀疑9个月前菲利克斯没有完全支持片段,但他们现在肯定是: http://osgithoughts.blogspot.com/2009/09/felix-now-fully-supports-osgi-fragments.html