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