OSGi + Hibernate

时间:2009-03-19 16:39:03

标签: hibernate persistence osgi

而不是将数据库操作分散在四个(osgi)包中,所有这些操作都略有不同。我想创建一个(简单的)OSGi包,负责所有持久性问题。我觉得这并不像听起来那么简单,因为“每捆独特的类加载器”的东西。 所以我真的很感激,如果有人知道这种问题的解决方案。

5 个答案:

答案 0 :(得分:5)

我可以通过两种方式来解决类加载问题。

  • 您是否与特定的OSGi框架绑定,或者您希望保持尽可能兼容?或者你可以使用equinox实现吗?在Equinox中,您有一种称为Buddy Classloading的机制。此添加允许您增加不同OSGi-Bundles之间某些类的可见性。如果您对此主题感兴趣,我想引导您阅读这两篇文章:Understanding how Eclipse plug-ins work with OSGiEclipse - a tale of two VMs (and many classloaders)
  • 如果您希望保持独立的OSGi实现,那么您可能会考虑将您希望保留的类提取到Hibernate-Bundle和其他bundle所依赖的单独的bundle中。这样,他们都可以访问持久化类的类定义。

答案 1 :(得分:4)

(如果您使用的是Hibernate Annotations)

当Hibernate包被告知带注释的类时,保存所有实体类加载器。

然后在构建SessionFactory之前执行类似的操作。

ClassLoad cl = Thread.currentThread().getContextClassLoader();
try {
 Thread.currentThread().setContextClassLoader(yourClassLoader);
 factory = cfg.buildSessionFactory(); 
}finally {
 Thread.currentThread().setContextClassLoader(cl);  // restore the original class loader
}

答案 2 :(得分:1)

刚刚在Bundle类/ api中找到了一个有趣的方法。

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

这必须解决一些类加载器问题吗?

答案 3 :(得分:1)

我将建议远离好友类加载,因为它特定于Eclipse的Equinox实现,在我看来,人们让它工作,但他们不明白为什么,每个人最终成为每个人的伙伴其他。这使您无法正确理解OSGi类加载的工作原理以及您需要使用的模式(复合类加载器,上下文类加载,OSGi服务......)。

如果持久性捆绑包提前知道需要持久化的类型,那么捆绑包可以导入包含域类的所有必需包(Require-Bundle是邪恶的)。

管理上下文类加载器(如在Roger的回复中)可以帮助Hibernate,尽管我建议使用类似Spring dm的东西来隐藏OSGi服务背后的内容。

答案 4 :(得分:0)

Hibernate does support OSGi,但它是ongoing effort