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

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

【问题讨论】:

    标签: hibernate persistence osgi


    【解决方案1】:

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

    • 您是否绑定到特定的 OSGi 框架,或者您希望尽可能保持兼容?或者您可以使用 Equinox 进行实施吗?在 Equinox 中,您有一种称为 Buddy Classloading 的机制。此添加允许您增加不同 OSGi 捆绑包之间某些类的可见性。如果你对这个话题感兴趣,我想把你引向这两篇文章:Understanding how Eclipse plug-ins work with OSGiEclipse - 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

            【讨论】:

              猜你喜欢
              • 2014-05-24
              • 2016-11-11
              • 2014-05-03
              • 2016-04-08
              • 2018-09-08
              • 2014-12-10
              • 2011-12-16
              • 2015-07-21
              • 2021-10-21
              相关资源
              最近更新 更多