我的类在我用于我的应用程序的不同插件中的名称完全相同,我希望能够使用 Hibernate 正确配置它们。问题在于,当 Hibernate 在进行映射时试图找到一个类时,它看起来像动态生成一个类的包名。对于一个插件,此方案有效,但跨多个插件它不起作用。看起来 Hibernate 在处理跨多个插件的 Hibernate 配置文件时会感到困惑。
这是因为每个插件都有自己的类加载器吗?继续使用现有插件和 Hibernate 进行这项工作的最佳方法是什么?
我的类在我用于我的应用程序的不同插件中的名称完全相同,我希望能够使用 Hibernate 正确配置它们。问题在于,当 Hibernate 在进行映射时试图找到一个类时,它看起来像动态生成一个类的包名。对于一个插件,此方案有效,但跨多个插件它不起作用。看起来 Hibernate 在处理跨多个插件的 Hibernate 配置文件时会感到困惑。
这是因为每个插件都有自己的类加载器吗?继续使用现有插件和 Hibernate 进行这项工作的最佳方法是什么?
问题是,每个插件都有自己的类加载器,而 Hibernate 使用反射来找到正确的类。
我家里有一篇关于这个问题的非常好的文章,但这篇文章是德文的。我将尝试解释您需要做什么。
为了让多个插件共享数据结构,您必须将其放入插件中并启用名为buddy-policy的功能。假设您有一个在启动时启动休眠的主应用程序插件,该插件需要“查看”数据结构插件中的类。为此,main-plugin 将其 Buddy-Policy 设置为“已注册”,并且 datastructure-plugin 将自身注册为“buddy”。不幸的是,您必须直接在清单文件中执行所有这些操作,至少在 3.3 中无法在编辑器中执行此操作。
一旦这个伙伴策略生效,Hibernate 也会生效。
我查看了我的旧应用程序,这就是我的做法。
以下是重要的几行:
休眠插件 de.eye4eye.hibernate
Eclipse-BuddyPolicy: registered
数据结构插件工具eye.datastructures
Eclipse-RegisterBuddy: de.eye4eye.hibernate
将这些行直接放在 MANIFEST.MF 中
这两个插件都需要重新导出它们的包,以便主应用程序或介于两者之间的任何层都可以使用它们。希望有帮助。
只是为了完成这个。
EclipseLink 可以用作 Eclipse RCP 应用程序中的 JPA 提供程序,而不是使用 Hibernate。EclipseLink 是 Oracle 的前 TopLink,已被选为 JPA 2 的参考实现。
RCP 的重点是,EclipseLink 可以作为 OSGI-Bundles (org.eclipse.persistence.jpa) 使用,因此它可以从另一个插件加载类而无需额外的伙伴策略。
目前我正在玩,使用以下项目结构(模型-视图-演示者模式)。括号中的名称指定依赖插件(并非全部包含,仅包含与此问题相关的插件)
在这种情况下,数据插件中的 JPA 提供者能够从模型插件加载类,而无需伙伴策略。
*注意,presenter 不依赖于任何 JPA 包,因为它是由 DAO 封装的(仍然使用它们的主要原因)
链接