Hibernate 3.5.x:NoSuchMethodError:javax.persistence.OneToMany.orphanRemoval

我正在尝试升级到Hibernate 3.5.3-FINAL。

运行我的unit testing时,我现在收到以下exception:

java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1837) 

我的类路径包含以下JAR:

来自hibernate dist:

 antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar javassist-3.9.0.GA.jar jta-1.1.jar slf4j-api-1.5.8.jar cglib-2.2.jar hibernate-jpa-2.0-api-1.0.0.Final.jar hibernate3.jar 

其他jar子:

 blazeds-common-3.2.0.3978.jar blazeds-core-3.2.0.3978.jar blazeds-opt-3.2.0.3978.jar blazeds-proxy-3.2.0.3978.jar blazeds-remoting-3.2.0.3978.jar commons-lang-2.3.jar dbunit-2.4.7.jar ejb3-persistence.jar // Note, I've tried excluding this, but I get different errors guava-r05.jar hsqldb-1.8.0.7.jar junit-4.1.jar lambdaj-2.0-with-dependencies.jar log4j-1.2.14.jar mockito-all-1.8.0.jar persistence-api-1.0.jar spring-security-core-2.0.0.jar spring.jar sqljdbc.jar 

我已经研究了这个,我发现答案表明我的网络服务器必须符合JPA2标准:

不幸的是,如果您的应用服务器不符合JPA 2,那么您很可能会失败

该项目是一个库,而不是一个Web服务器项目。 (虽然它最终被部署到网络服务器,但我只是在这里运行unit testing)

我错过了什么?

作为旁注,每次升级Hibernate时,我都会花费数小时研究MethodNotFoundExceptionClassNotFoundException的冲突jar,这是非常令人沮丧的。 必须有一个更简单的方法吗?

我确信通过宣布他们将模块合并回一个核心项目,这些冲突会消失吗?

正如Timo所指出的,删除persistence-api-1.0.jar

以防万一,这里是我正在使用的依赖项:

 org.hibernate作为:hibernate-的EntityManager中:jar:3.5.3决赛:编译
 +  -  org.hibernate:hibernate-core:jar:3.5.3-Final:compile
 |  +  -  antlr:antlr:jar:2.7.6:编译
 |  +  -  commons-collections:commons-collections:jar:3.2:compile
 |  +  -  dom4j:dom4j:jar:1.6.1:编译
 |  |  \  -  xml-apis:xml-apis:jar:1.0.b2:compile
 |  \  -  javax.transaction:jta:jar:1.1:编译
 +  -  org.hibernate:hibernate-annotations:jar:3.5.3-Final:compile
 |  \  -  org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile
 +  -  cglib:cglib:jar:2.2:编译
 |  \  -  asm:asm:jar:3.1:编译
 +  -  javassist:javassist:jar:3.9.0.GA:compile
 \  -  org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile

我从我的pom.xml这个单一声明中获取它们:

  org.hibernate hibernate-entitymanager 3.5.3-Final  

这应该以某种方式回答你的纵容咆哮(如果我改写:使用Maven – 或者知道你在做什么)。

从项目lib位置persistence-api-1.0.jar ejb3-persistence.jar中删除这些文件

仅添加javax.persistence-2.0.0.jar

它包含所有必需的字段和atrributes。

试试这个它会解决你的问题。

Manish Jaiswal

尝试用JPA 2.0 jar替换persistence-api-1.0.jar。

至少通过我正在使用的内容发现了该问题的修复:IBM WebSphere 7和MyEclipse Blue(Spring),或Bling,ver。 10.6。 我创建了一个依赖于其他项目的应用程序,其中一个使用Hibernate 3.6.3,需要JPA 2.0。 IBM WS在JPA 2.0之前加载JPA 1.0以支持自身,并将对JPA的所有引用解析为ver。 1.0。 对于IBM WS,这会导致上面报告的错误。 我从现在开始遇到的唯一修复包括将JPA 2.0添加为共享库,然后将服务器设置为在其本机类之前加载该库,类似于此处讨论的方法:

http://www.mkyong.com/websphere/websphere-7-javaxpersistenceonetomany-orphanremoval-error/

但是我们的服务器管理员不允许更改服务器范围的类加载器策略。 所以我仍然需要找到一种方法让我的项目使用JPA 2.0而不是1.0。 我尝试了很多东西,但终于去了一个冰雹玛丽,它起作用了。

解决方法是将JPA 2.0 .jar文件添加到.war和.ear项目中,然后编辑.war和.ear项目中清单文件中的Class-Path行以指向.jar文件。 似乎它们必须同时存在,否则方法将无效,因此JPA 2.0 .jar必须同时包含.war和.ear。

在您的应用程序(.war项目)中,将hibernate-jpa-2.0-api-1.0.0.Final.jar添加到项目根目录。 MyEclipse Blue会将其显示为该位置的文件,并在Package Explorer视图中的“Referenced Libraries”下列出。 然后在/WebRoot/META-INF/MANIFEST.MF处打开清单文件,并确保Class-Path行读取:

 Class-Path: /hibernate-jpa-2.0-api-1.0.0.Final.jar 

在.ear项目中,将hibernate-jpa-2.0-api-1.0.0.Final.jar添加到项目根目录下的文件夹’lib’。 如果那里没有’lib’文件夹,请创建一个。 然后在/META-INF/MANIFEST.MF中,确保Class-Path行读取:

 Class-Path: /lib/hibernate-jpa-2.0-api-1.0.0.Final.jar 

确保保存所有文件并执行干净的构建。 然后导出.ear并像往常一样通过Integrated Solutions Console进行部署。 但是,在变革发挥作用之前,还有另一件事要做; 它确实需要更改应用程序的类加载策略,而不是服务器。 您更有可能让WAS管理员为此而不是更改整个服务器的类加载器策略。 要进行必要的更改,请在安装.ear文件后,按照左侧导航栏单击"Applications\Application Types\Websphere enterprise applications"跟踪并单击"Applications\Application Types\Websphere enterprise applications"的名称,然后单击“类加载和update detection" 。 然后在"Class loader order"下选择"Classes loaded with local class loader first (parent last)" "Class loader order" ,然后单击“ Apply "Class loader order" ,再单击"Class loader order" Save 。 现在返回点击"Applications\Application Types\Websphere enterprise applications" ,启动或重新启动您的应用程序。 测试你的应用程序,希望你会很高兴。

最后注意事项: Evey重新部署.ear文件的时间,您需要设置我刚才讨论过的classloader选项。 部署之间不保留首选项。

添加javax.persistence-2.0.0.jar应该可以正常工作……

将服务器的应用程序类加载器策略设置为父级最后将解决此问题,只要您确保在EAR中包含hibernate-jpa-2.0-api jar文件即可。 如果在您的环境中这是可能的,那么这是一个更容易的解决方案。

在WebSphere 7上测试过。