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


85

我有一个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.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]

1
您正在调用的新版本中不存在的方法
Brian Roach 2013年

Answers:


79

我遇到了同样的问题。这里的问题是play-java-jpa工件(build.sbt文件中的javaJpa键)取决于规范的不同版本(version 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"
)

这是为了play 2.2.x。在以前的版本中,生成文件有所不同。


1
太棒了,它有效!谢谢。对于未来的参考,下面是文档的链接排除传递依赖:scala-sbt.org/0.12.2/docs/Detailed-Topics/...
musubi

4
谢谢!对于Maven用户:它的意思只是不使用<groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> 任何更多的
橡木

4
对于hibernate-jpa-2.0-apiHibernate4.2.8.Final版本,工作4.3.0.Final也将引发错误。
Harmeet Singh Taara 2014年

在Play 2.2.3 libraryDependencies ++= Seq( javaJdbc, javaEbean, cache, javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"), "org.hibernate" % "hibernate-core" % "4.3.0.Final", "org.hibernate" % "hibernate-entitymanager" % "4.3.0.Final", "com.typesafe" %% "play-plugins-mailer" % "2.2.0", "postgresql" % "postgresql" % "9.1-901-1.jdbc4", "com.google.guava" % "guava-base" % "r03", "org.apache.commons" % "commons-io" % "1.3.2" )上仍会抛出NoSuchMethodExceptionNoSuchMethodError:javax.persistence.JoinTable.indexes()任何人都知道如何解决?
FrancescoM

Play 2.3.4版本也面临相同的问题。这是堆栈跟踪play.api.UnexpectedException:意外异常[NoSuchMethodError:javax.persistence.Table.indexes()[Ljavax / persistence / Index;]在play.core.ReloadableApplication $$ anonfun $ get $ 1 $$ anonfun $ apply $ 1 $$ anonfun $ 1.apply(ApplicationProvider.scala:170)〜[play_2.11-2.3.4.jar:2.3.4] at play.core.ReloadableApplication $$ anonfun $ get $ 1 $$ anonfun $ apply $ 1 $$ anonfun $ 1.apply(ApplicationProvider.scala:130)〜[play_2.11-2.3.4.jar:2.3.4]在scala.Option.map(Option.scala:145)〜[scala-library-2.11.1。 jar:na]
Ketan Khairnar 2014年

71

Hibernate 4.3是第一个实现JPA 2.1规范(Java EE 7的一部分)的版本。因此,它期望在类路径中使用JPA 2.1库,而不是JPA 2.0库。这就是为什么会出现此异常的原因:Table.indexes()是JPA 2.1中引入的Table的新属性。


我当时走的是同一条路,但是发生错误的代码正在调用indexes()type的引用org.hibernate.annotations.Table
Sotirios Delimanolis

1
那么,您可能没有在查看正确的代码。见github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…–
JB Nizet

1
@JBNizet JPA 2.1仅在Java EE 7中可用而不在SE 7中可用吗?我猜Java SE 7中提供了JPA 2.0吗?
musubi

2
@JBNizet那么解决方案是什么。我可以将Java EE更改为7还是将JPA 2.0更改为JPA 2.1?如果这样做,
则会

1
<!- mvnrepository.com/artifact/javax.persistence/…- > <dependency> <groupId> javax.persistence </ groupId> <artifactId> javax.persistence-api </ artifactId> <version> 2.2 </ version > </ dependency>
bula

15

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

mvn dependency:tree >dep.txt

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


14

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

6

我可以简单地通过用“ hibernate-jpa-2.1-api”替换位于jboss7 / modules / javax / persistence / api / main的JPA api jar文件来解决此问题。还可以更新目录中的module.xml。


4

错误: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>

并将其替换为:

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

希望它能帮助某人。


0

我在Spring Boot应用程序中遇到了相同的问题。从lib文件夹中手动删除javax.persistance.jar文件后。问题是固定的。在pom.xml文件中,我仅遵循以下依赖性

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

0

我有同样的问题,我通过使用org.hibernate.annotations.Table注解而不是javax.persistence.Table在Entity类中解决了它。

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

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

0

您的类路径中有多个JPA提供程序。或至少在您的Application Server lib文件夹中。

如果您使用的是Maven,请使用此处提到的命令检查依赖项 https://stackoverflow.com/a/47474708/3333878

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

如果您的类路径中只有一个依赖项,则可能是应用程序服务器的类加载器。

由于JavaEE应用程序服务器(如Websphere,Wildfly,Tomee等)具有自己的JPA和其他EE标准的实现,因此Class loader可能会加载其自己的实现,而不是从WAR / EAR文件中的类路径中选择。

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

  1. 在Application Servers库路径中删除有问题的jar。继续小心,因为它可能会破坏其他托管应用程序。

在Tomee 1.7.5 Plume / Web中,它将使用JPA 2.0捆绑eclipselink-2.4.2lib文件夹中,但是我必须从中使用JPA 2.1 org.hibernate:hibernate-core:5.1.17,因此删除了eclipselink jar,并从休眠核心添加了所有相关/可传递的依赖项。

  1. 添加共享库。并手动将jar添加到应用服务器的路径。Websphere具有此选项。

  2. 在Websphere中,可以更改类加载器的执行。因此,使其成为应用程序服务器的类路径,以使其最后加载(即,父级最后加载)并首先加载您的路径。可以解决这个。

在继续第一点之前,请检查您的应用服务器是否具有上述功能。

IBM Websphere参考:

https://www.ibm.com/support/knowledgecenter/SSEQTP_9.0.5/com.ibm.websphere.base.doc/ae/trun_classload_server.html

https://www.ibm.com/support/pages/how-create-shared-library-and-associate-it-application-server-or-enterprise-application-websphere-application-server

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.