【发布时间】:2010-10-14 08:40:36
【问题描述】:
而不是将数据库操作分散在四个 (osgi) 包中,所有操作都略有不同。我想创建一个负责所有持久性问题的(简单)OSGi 包。我觉得这并不像听起来那么简单,因为“每个包唯一的类加载器”的事情。 所以我真正希望的是,如果有人知道这类问题的解决方案。
【问题讨论】:
标签: hibernate persistence osgi
而不是将数据库操作分散在四个 (osgi) 包中,所有操作都略有不同。我想创建一个负责所有持久性问题的(简单)OSGi 包。我觉得这并不像听起来那么简单,因为“每个包唯一的类加载器”的事情。 所以我真正希望的是,如果有人知道这类问题的解决方案。
【问题讨论】:
标签: hibernate persistence osgi
我可以想到两种方法来解决类加载问题。
【讨论】:
(如果您使用的是 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
}
【讨论】:
刚刚在 Bundle 类/api 中发现了一个有趣的方法。
public java.lang.Class loadClass(java.lang.String name) throws java.lang.ClassNotFoundException
这必须解决一些类加载器问题?
【讨论】:
我将建议远离伙伴类加载,因为它特定于 Eclipse 的 Equinox 实现,并且在我看来,人们可以让它工作,但他们不明白为什么,每个人最终都是每个人的伙伴别的。这使您无法正确理解 OSGi 类加载的工作原理以及您需要使用的模式(复合类加载器、上下文类加载、OSGi 服务......)。
如果你的持久化包提前知道它需要持久化什么类型,那么包可以导入所有包含你的域类的必需包(Require-Bundle 是邪恶的)。
管理上下文类加载器(如 Roger 的回复中所示)可以帮助使用 Hibernate,但我建议使用 Spring dm 之类的东西将其隐藏在 OSGi 服务后面。
【讨论】:
【讨论】: