我遇到了一个令人沮丧的问题。我使用Apache Felix作为我的OSGi框架,也使用Hibernate来解决持久性问题。
我使用的是Hibernate (com.springsource.org.hibernate-3.2.6.ga.jar).的"osgi-bundle“版本据我所知,这是Hibernate Core,在META-INF/MANIFEST.mf中安装了一些额外的osgi-metdata。这些信息(Package-Export和Package-Import)对于osgi系统至关重要。
我的问题是Hibernate包找不到我的JDBC驱动程序。将Import语句添加到springsource Hibernate捆绑包中感觉非常错误。一定有更好的方法来解决这个问题。
发布于 2009-05-07 17:53:43
我在一段时间前遇到过similar problem。解决方案是将jdbc提供者捆绑包和jdbc用户捆绑包注册为“伙伴”。这是因为一个包不能在没有显式声明的情况下使用另一个包的类( jdbc驱动程序也是如此)。这是为Eclipse编写的,所以我认为它可能会对您有所帮助。
发布于 2009-04-13 18:45:34
Hibernate不是一个很好的OSGi公民,因为在OSGi容器中,Hibernate对类可见性所做的许多假设都不再正确。
通常使用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服务中,因为这使得控制上下文类加载器变得很容易。
发布于 2009-03-25 17:06:58
你是否注意到了正确的捆绑包开始顺序?有一种方法可以设置每个包的启动级别,以便您的系统可以正确引导。如果一些激活者试图直接获取服务,则可能需要正确的捆绑包启动级别。在服务不可用的情况下,服务使用者将被卡住。
试着为你的捆绑包设置合适的启动级别,看看它是否有效。具体地说,在hibernate捆绑包之前,必须先启动带有JDBC驱动程序的捆绑包。
另一个问题可能是您有一些未解决的依赖项。确保所有东西都在那里。您可以通过获取OSGi控制台并请求服务列表来完成此操作。在Equinox中,这可以归结为OSGi shell中的-console命令行参数和"ss“后跟"diag”命令。
编辑(回复您的评论):
驱动程序通过它们的接口进行注册。然后Hibernate可能会通过它的接口查找驱动程序,而不需要导入特定的驱动程序类。无论如何,这将引入对特定于实现的类的不希望的依赖。
https://stackoverflow.com/questions/682318
复制相似问题