Hibernate OSGi+;冬眠

Hibernate OSGi+;冬眠,hibernate,persistence,osgi,Hibernate,Persistence,Osgi,不是将数据库操作分散在四个(osgi)包中,而是在那里执行稍微不同的操作。我想创建一个(简单的)OSGi包,负责所有持久性问题。我觉得这并不像听起来那么简单,因为“每个包都有唯一的类加载器”。 因此,如果有人知道这类问题的解决方案,我会非常感激 我可以想出两种方法来解决类加载问题 您是否绑定到特定的OSGi框架,还是希望尽可能保持兼容?或者您可以使用equinox进行实现?在Equinox中,有一种称为Buddy Classloading的机制。此添加允许您增加不同OSGi捆绑包之间某些类的可

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

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

  • 您是否绑定到特定的OSGi框架,还是希望尽可能保持兼容?或者您可以使用equinox进行实现?在Equinox中,有一种称为Buddy Classloading的机制。此添加允许您增加不同OSGi捆绑包之间某些类的可见性。如果你对这个话题感兴趣,我想让你看看这两篇文章:
  • 如果您希望保持OSGi实现独立,那么您可以考虑将您希望持久化的类提取到一个单独的包中,Hibernate包和其他包都依赖于这个包。这样,它们都可以访问持久化类的类定义

刚刚在Bundle类/api中找到了一个有趣的方法

public java.lang.Class loadClass(java.lang.String name) throws java.lang.ClassNotFoundException
这必须解决一些类加载器问题(如果您使用的是Hibernate注释)

当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
}

我建议不要加载buddy类,因为这是Eclipse的Equinox实现特有的,在我看来,人们可以让它工作,但他们不明白为什么,最终每个人都是其他人的好友。这使您无法正确理解OSGi类加载的工作方式以及使用它所需的模式(复合类加载程序、上下文类加载、OSGi服务等等)

如果您的持久性捆绑包提前知道需要持久化哪些类型,那么该捆绑包可以导入包含您的域类的所有必需包(requirebundle是邪恶的)

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

Hibernate是一个很好的工具