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

javax.persistence.Table.indexes()中的NoSuchMethodError[Ljavax/persistence/Index,java,playframework-2.0,hibernate-4.x,Java,Playframework 2.0,Hibernate 4.x,我有一个Play Framework应用程序,我使用的是Hibernate 4.2.5.Final(通过Maven依赖关系管理器检索)。我决定升级到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.Final,再到4

我有一个Play Framework应用程序,我使用的是Hibernate 4.2.5.Final(通过Maven依赖关系管理器检索)。我决定升级到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.Final,再到4.3.Final。问题直到升级到4.3.0.最终版本

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]

Hibernate 4.3是实现JPA 2.1规范(Java EE 7的一部分)的第一个版本。因此,它希望类路径中有JPA 2.1库,而不是JPA 2.0库。这就是为什么会出现此异常:Table.indexes()是表的一个新属性,在JPA2.1中引入。我遇到了相同的问题。这里的问题是,播放java JPA工件(build.sbt文件中的javaJpa密钥)取决于不同版本的规范
(版本2.0->“org.hibernate.javax.persistence”%%“hibernate-JPA-2.0-api”%%“1.0.1.Final”)

当您添加hibernate entitymanager 4.3时,这带来了更新的规范(2.1)和entitymanager的不同工厂提供程序。基本上,您在类路径中将两个JAR都作为可传递的依赖项

像这样编辑build.sbt文件,它会暂时解决您的问题,直到play为新的api依赖项发布新版本的jpa插件

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

这是用于播放2.2.x的。在以前的版本中,生成文件存在一些差异。

类路径上可能有两个不同版本的hibernate jpa api。要检查该运行:

mvn dependency:tree >dep.txt

然后搜索是否有hibernate-jpa-2.0-api和hibernate-jpa-2.1-api。并排除多余的。

我只需将位于jboss7/modules/javax/persistence/api/main的jpa api jar文件替换为“hibernate-jpa-2.1-api”。同时更新目录中的module.xml即可解决此问题。

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

解决我问题的唯一办法是删除pom.xml中的以下依赖项:

org.hibernate.javax.persistence
hibernate-jpa-2.1-api
1.0.0.1决赛

并将其替换为:

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

javax.persistence
持久性api
1.0.2

希望它能帮助到别人。

我将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>

org.hibernate.javax.persistence
hibernate-jpa-2.1-api
1.0.0.1决赛

我在spring boot应用程序中遇到了同样的问题。在从lib文件夹手动删除javax.persistence.jar文件后,问题得到了解决。在pom.xml文件中,我只保留了以下依赖项

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>

org.springframework.boot
spring引导启动器数据jpa

我也遇到了同样的问题,我通过在实体类中使用
org.hibernate.annotations.Table
注释而不是
javax.persistence.Table
修复了它

import javax.persistence.Entity;
import org.hibernate.annotations.Table;

@Entity
@Table(appliesTo = "my_table")
public class MyTable{
//and rest of the code

类路径中有多个JPA提供程序,或者至少在应用程序服务器库文件夹中有多个JPA提供程序

如果您使用的是Maven 使用此处提到的命令检查依赖项

然后通过删除/排除不需要的依赖项进行修复

libraryDependencies ++= Seq(
javaJdbc,
javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"),
"org.hibernate" % "hibernate-entitymanager" % "4.3.0.Final"
)
如果类路径中只有一个依赖项,那么应用程序服务器的类加载器可能就是问题所在

由于像Websphere、Wildfly、Tomee等JavaEE应用服务器都有自己的JPA和其他EE标准的实现,类加载器可能会加载自己的实现,而不是从WAR/EAR文件中的类路径中选择

为了避免这种情况,您可以尝试以下步骤

  • 正在删除应用程序服务器库路径中有问题的jar。请小心操作,因为它可能会破坏其他托管应用程序
  • 在Tomee 1.7.5 Plume/Web中,它将使用JPA 2.0在
    lib
    文件夹中捆绑
    eclipselink-2.4.2
    ,但我不得不从
    org.hibernate:hibernate core:5.1.17
    中使用JPA 2.1,因此删除了eclipselink jar并从hibernate core添加了所有相关/可传递的依赖项

  • 添加共享库。并手动将JAR添加到应用程序服务器的路径。Websphere有此选项

  • 在Websphere中,类加载器的执行是可以更改的。因此,使其成为应用服务器的类路径,以便最后加载,即,父级最后加载,并让您的路径首先加载。可以解决此问题

  • 在继续第一点之前,请检查您的appserver是否具有上述功能

    Ibm websphere参考:


    您正在调用一个新版本中不存在的方法,但发生错误的代码正在调用
    index()
    参考类型为
    org.hibernate.annotations.Table
    。那么,您可能没有看到正确的代码。请看@JBNizet是否JPA 2.1仅在Java EE 7中可用,而在SE 7中不可用?我猜JPA 2.0在Java SE 7中可用?@JBNizet那么解决方案是什么。我可以将Java EE更改为7,还是将JPA 2.0更改为JPA 2.1??如果我这样做会产生错误..javax.persistence javax.persistence-api 2.2太棒了!谢谢。为了将来参考,这里有一个排除可传递依赖项的文档链接:谢谢!对于maven用户:这意味着不要再使用
    org.hibernate.java-persistence jpa api
    了Hibernate
    4.2.8.Final
    Version是work
    4.3.0.Final
    也会抛出一个错误。在Play 2.2.3
    libraryDependencies++=Seq(javaJdbc,javaEbean,cache,javaJpa.exclude(“org.Hibernate.javax.persistence”,“Hibernate-jpa-2.0-api”),“org.Hibernate”%