javax.persistence.Table.indexes()中的NoSuchMethodError [Ljavax / persistence / Index

我有一个Play Framework应用程序,我正在使用Hibernate 4.2.5.Final(通过Maven依赖pipe理器检索)。 我决定升级到Hibernate 4.3.0.Final,成功重新编译我的应用程序,并运行它。

我得到了下面的例外,并没有能够找出原因。 我降级到4.2.5,这个问题没有发生。 然后,我尝试在4.2.5之后的每个最终版本上升级Hibernate。 也就是我从4.2.5.Final到4.2.6.Final,到4.2.7.Final,到4.2.8。最后到4.3,最后。 直到我升级到4.3.0.Final,问题不会发生。

Java版本信息

java version "1.7.0_45" Java(TM) SE Runtime Environment (build 1.7.0_45-b18) Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode) 

和例外

 play.api.UnexpectedException: Unexpected exception[NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:152) ~[play_2.10.jar:2.2.1] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(ApplicationProvider.scala:112) ~[play_2.10.jar:2.2.1] at scala.Option.map(Option.scala:145) ~[scala-library.jar:na] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:112) ~[play_2.10.jar:2.2.1] at play.core.ReloadableApplication$$anonfun$get$1$$anonfun$apply$1.apply(ApplicationProvider.scala:110) ~[play_2.10.jar:2.2.1] at scala.util.Success.flatMap(Try.scala:200) ~[scala-library.jar:na] Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index; at org.hibernate.cfg.annotations.EntityBinder.processComplementaryTableDefinitions(EntityBinder.java:936) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final] at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:781) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final] at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3762) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final] at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3716) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final] at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final] at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) ~[hibernate-core-4.3.0.Final.jar:4.3.0.Final] 

我遇到了同样的问题。 这里的问题是,play-java-jpa工件(build.sbt文件中的javaJpa键)依赖于不同版本的spec (version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final")

当你添加hibernate-entitymanager 4.3的时候,这个更新的spec(2.1)和一个不同的工厂提供者给了entitymanager。 基本上,你最终将类path中的两个jar作为传递依赖关系。

像这样编辑你的build.sbt文件,它会暂时解决你的问题,直到发挥新的api依赖关系的新版本的jpa插件。

 libraryDependencies ++= Seq( javaJdbc, javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"), "org.hibernate" % "hibernate-entitymanager" % "4.3.0.Final" ) 

这是play 2.2.x 在以前的版本中,构build文件中存在一些差异。

Hibernate 4.3是实现JPA 2.1规范(Java EE 7的一部分)的第一个版本。 因此,它期望类path中的JPA 2.1库,而不是JPA 2.0库。 这就是为什么你会得到这个exception:Table.indexes()是JPA 2.1中引入的Table的一个新属性

你可能在classpath上有2个不同版本的hibernate-jpa-api。 要检查运行:

 mvn dependency:tree >dep.txt 

然后search是否有hibernate-jpa-2.0-api和hibernate-jpa-2.1-api。 并排除多余的一个。

我更新我的Hibernate JPA到2.1,它的工作原理。

 <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency> 

我可以通过用'hibernate-jpa-2.1-api'replace位于jboss7 / modules / javax / persistence / api / main的JPA api jar文件来解决这个问题。 还要更新目录中的module.xml。

错误:java.lang.NoSuchMethodError:javax.persistence.JoinTable.indexes()[Ljavax / persistence / Index;

解决我的问题的唯一办法是在pom.xml中删除以下依赖项: <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>

并将其replace为:

 <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0.2</version> </dependency> 

希望它可以帮助别人。