8

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

4

5 回答 5

5

我可以想到两种方法来解决类加载问题。

  • 您是绑定到特定的 OSGi 框架,还是希望尽可能保持兼容?或者您可以使用 Equinox 进行实施吗?在 Equinox 中,您有一种称为 Buddy Classloading 的机制。此添加允许您增加不同 OSGi 捆绑包之间某些类的可见性。如果您对此主题感兴趣,我想向您介绍这两篇文章:了解 Eclipse 插件如何与 OSGi 一起工作Eclipse - 两个 VM(和许多类加载器)的故事
  • 如果您更喜欢保持 OSGi 实现独立,那么您可能会考虑将您希望保留的类提取到一个单独的包中,Hibernate-Bundle 和您的其他包都依赖于该包。这样,他们都可以访问持久类的类定义。
于 2009-03-19T19:38:57.780 回答
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
}
于 2009-04-05T10:04:42.447 回答
1

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

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

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

于 2009-03-26T21:17:32.853 回答
1

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

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

管理上下文类加载器(如 Roger 的回复中所示)可以帮助 Hibernate,但我建议使用 Spring dm 之类的东西将其隐藏在 OSGi 服务后面。

于 2009-04-13T19:31:49.867 回答
0

Hibernate确实支持 OSGi,但这是一项持续的努力

于 2015-07-31T05:45:50.627 回答