我们有一个使用Hibernate 3.0.5的遗留应用程序,我们正在尝试将其升级到Hibernate 3.3.2(对当前代码影响较小的版本)。
更新pom.xml
中的依赖项后,应用程序正确部署,但在存在延迟关联的查询中,会发生以下错误:
java.lang.AbstractMethodError: org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.setUnwrap(Z)V
依赖关系配置如下:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.2.GA</version>
<exclusions>
<!--
Excludes to avoid conflict with JBoss libs
See http://stackoverflow.com/questions/3413488/saxparser-errors-with-hibernate-and-jboss-conflicting-versions
-->
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>1.0.b2</version>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.4.GA</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
我们已经尝试切换do CGLIB而不是Javassist,但我们在等效类(org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer
)上收到相同的错误。没有堆栈跟踪。下面是抛出错误时执行堆栈的图片。
该应用程序正在 JBoss 5.1.0 上运行。
有关此错误的任何提示?这可能是javassist库的错误版本吗?
EDITED
答案 0 :(得分:0)
我遇到了一个与此问题非常类似的问题,结果证明它是一个JBoss Class Loader问题。 JBoss配置从一个版本快速更改到下一个版本,我建议的解决方案为我工作使用JBoss EAP 5.1.2。
到此为止。
首先,确保显式在您的POM中包含Hibernate的版本:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.2.GA</version>
</dependency>
接下来,您需要通过在WAR文件的jboss-web.xml
文件夹中包含一个名为WEB-INF
的文件来覆盖JBoss的默认ClassLoader隔离(同样的方法也应该如果您正在部署EAR,请继续工作)。它的格式如下:
<jboss-web>
<class-loading>
<loader-repository>
org.hibernate=my-application.war
<loader-repository-config>java2ParentDelegation=false</loader-repository-config>
</loader-repository>
</class-loading>
</jboss-web>
其中my-application.war
是WAR文件的名称。请注意,java2ParentDelegation
设置为false可能有助于解决其他ClassLoader问题(特别是根据我的经验,使用slf4j)。
最后,JBoss 5.1.x ClassLoader问题需要处理令人抓狂,所以我希望这会有所帮助。要记住的是,问题与javassist 本身无关(您可以考虑删除POM中的显式javassist <dependency>
,让Maven根据Hibernate解析它<dependency>
)。这很可能是ClassLoader问题。 ClassLoading的默认JBoss策略大部分时间都可以工作,直到你得到Hibernate。 JBoss V6之前的版本与JBoss附带的Hibernate的特定版本密切相关,因此尝试使用不同版本的Hibernate而不是JBoss想要使用的版本是一个真正的痛苦。但它可以做到!
对于EAR文件,该文件名为jboss-app.xml
,并且位于EAR文件的META-INF
文件夹中:
<jboss-app>
<loader-repository>
org.hibernate:archive=my-application.ear
<loader-repository-config>
java2ParentDelegation=false
</loader-repository-config>
</loader-repository>
</jboss-app>
祝你好运!