OSGi + 休眠

Posted

技术标签:

【中文标题】OSGi + 休眠【英文标题】:OSGi + Hibernate 【发布时间】:2010-10-14 08:40:36 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

(如果您使用的是 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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

休眠does support OSGi,但它是ongoing effort。

【讨论】:

以上是关于OSGi + 休眠的主要内容,如果未能解决你的问题,请参考以下文章

OSGi 上的 PostgreSQL 连接器

OSGi 包从类路径错误中获取资源

在有或没有 OSGi 的情况下使用 JPA 的区别

具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包

Hibernate ClassNotFoundException: org.hibernate.proxy.HibernateProxy

电脑休眠怎么唤醒?