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 + 休眠的主要内容,如果未能解决你的问题,请参考以下文章
具有运行时 pojos 的带有 Hibernate 的 OSGi 片段包
Hibernate ClassNotFoundException: org.hibernate.proxy.HibernateProxy