代码之家  ›  专栏  ›  技术社区  ›  AlbertoPL

将Hibernate与动态Eclipse插件一起使用

  •  4
  • AlbertoPL  · 技术社区  · 15 年前

    我的应用程序使用的不同插件中的类的名称完全相同,我希望能够使用Hibernate正确地配置它们。问题在于,Hibernate在进行映射时试图查找类时,似乎会动态生成类的包名。对于一个插件,此方案可以工作,但在多个插件中它不工作。在跨多个插件处理Hibernate配置文件时,Hibernate似乎会感到困惑。

    这是因为每个插件都有自己的类加载器吗?使用现有的插件和Hibernate,最好的方法是什么?

    2 回复  |  直到 15 年前
        1
  •  4
  •   lostiniceland    15 年前

    问题是,每个插件都有自己的类加载器,Hibernate使用反射来查找正确的类。

    我在家里有一篇关于这个问题的非常好的文章,但这篇是用德语写的。我会尽力解释你需要做什么。

    为了在多个插件上共享数据结构,您必须将其放入一个插件中并启用一个名为 伙伴政策 . 假设您有一个主应用程序插件,它在启动时启动hibernate,这个插件需要“查看”数据结构插件中的类。这样做 主插件将其好友策略设置为“已注册”,数据结构插件将其自身注册为“好友” . 不幸的是,您必须在manifest文件中直接执行这些操作,至少在3.3中,在编辑器中无法执行这些操作。

    一旦这个伙伴策略起作用,Hibernate也将启动。

    我查了一下我以前的申请表,下面是我是怎么做的。

    1. 主应用程序(toolsey.rcp)依赖于hibernate插件(de.eye4eye.hibernate)和数据结构插件(toolsey.datastructures)
    2. hibernate插件将其好友策略指定为“已注册”
    3. datastructure插件将自己注册到hibernate插件

    以下是重要的几行:

    Hibernate插件de.eye4eye.Hibernate

    Eclipse-BuddyPolicy: registered
    

    Eclipse-RegisterBuddy: de.eye4eye.hibernate
    

    这两个插件都需要重新导出它们的包,以便主应用程序或中间的任何层都可以使用它们。 希望这有帮助。

        2
  •  1
  •   lostiniceland    15 年前

    只是为了完成这一切。

    EclipseLink可以在EclipseRCP应用程序中用作JPA提供者,而不是使用Hibernate。EclipseLink是Oracle的前TopLink,被选为JPA2的参考实现。

    RCP的要点是,EclipseLink作为OSGI捆绑包(org.eclipse.persistence.jpa)提供,因此它可以从另一个插件加载类,而无需额外的好友策略。

    • rcp.mvp.view (rcp.mvp.presenter)/ rcp.mvp.model)
    • rcp.mvp.presenter (rcp.mvp.data)- 数据重新导出模型,因此这是 (此处不需要)*
    • (rcp.mvp.data.mysql/ rcp.mvp.model/javax.persistence/ org.eclipse.persistence.jpa)
    • rcp.mvp.data.mysql -只提供 mysql jdbc驱动程序。一定是 类路径内部
    • rcp.mvp.model

    在这个场景中,数据插件中的JPA提供者能够从模型插件加载类,而无需伙伴策略。

    *注意,演示者不依赖于任何JPA包,因为它是由DAOs封装的(仍然使用它们的主要原因)

    链接