我有一个基于插件的Eclipse应用程序,我将持久数据放在X插件中,而hibernate-database服务放在Y插件中。
持久化类在X中,HibernateUtil,Dao,所有与hibernate相关的jar和持久化类的hbm.xml映射文件都在Y中。
当我运行应用程序时,我看到很多例外情况:
java.lang.RuntimeException
javassist.CannotCompileException
java.lang.ClassNotFoundException
org.hibernate.HibernateException
所有这些都以“java.lang.NoClassDefFoundError:org / hibernate / proxy / HibernateProxy”结束
如果我在localhost上使用数据库,这些异常不会影响我的应用程序。 但是当我尝试连接到远程数据库时,我的嵌套HQL查询不起作用。我猜这与代理有关。
有没有办法摆脱这个问题而不将X和Y插件合并到一个插件中?
答案 0 :(得分:1)
问题不是很大程度上是由于eclipse插件的加载机制造成的。有一个解决方案 - 伙伴加载。
在Hibernate插件的MANIFEST.MF文件中(需要加载伙伴),例如org.hibernate.eclipse,添加一行:
Eclipse-BuddyPolicy:registered
并在插件项目或RCP项目的MANIFEST.MF文件中添加以下行:
Eclipse-RegisterBuddy:org.hibernate.eclipse
这应解决问题。
这是关于此问题的博客文章:
http://hwellmann.blogspot.de/2008/11/hibernate-and-osgi-pragmatic-solution.html
答案 1 :(得分:0)
远程部署中错过了Hibernate支持库。
在WEB-INF下创建一个lib
文件夹,并将所有支持的jar文件复制到此lib文件夹。
答案 2 :(得分:0)
这解决了这个问题:
在X插件中, Eclipse-BuddyPolicy:已注册
在Y插件中, Require-Bundle:(x插件ID) Eclipse-RegisterBuddy:(x插件ID)
答案 3 :(得分:0)
从根本上说,这是一个经典OSGi ClassLoader issue.解决方案取决于您使用的Hibernate版本。
您必须设置ProxyFactory classLoaderProvider以提供包含
的类加载器Hibernate现在使用代理工厂中实体类的类加载器。您必须在包含实体类 {的包的OSGi清单的Import-Package部分中包含Hibernate代理(org.hibernate.proxy)和Javassist(javassist.util.proxy)。 {3}},可能与创建EntityManagerFactory的bundle不同。
答案 4 :(得分:0)
我遇到了运行Arquillian测试的异常。 在我的情况下,我忘了将persistence.xml添加到存档:
archive.addAsResource("META-INF/persistence.xml", "META-INF/persistence.xml");