【问题标题】:NoSuchMethodError in javax.persistence.Table.indexes()[Ljavax/persistence/Indexjavax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError
【发布时间】:2014-01-11 03:22:42
【问题描述】:

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

【问题讨论】:

  • 您正在调用新版本中不存在的方法

标签: java playframework-2.0 hibernate-4.x


【解决方案1】:

我遇到了同样的问题。这里的问题是 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) 和实体管理器的不同工厂提供程序。基本上你最终在类路径中都有两个 jar 作为传递依赖。

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

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的。在以前的版本中,构建文件存在一些差异。

【讨论】:

  • 太棒了,它成功了!谢谢。供将来参考,这里是排除传递依赖的文档链接:scala-sbt.org/0.12.2/docs/Detailed-Topics/…
  • 谢谢!对于 maven 用户:这意味着不要再使用<groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId>
  • For hibernate-jpa-2.0-api Hibernate 4.2.8.Final Version is work 4.3.0.Final 也会报错。
  • On 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" ) 仍在抛出 NoSuchMethodException NoSuchMethodError:javax.persistence.JoinTable.indexes() 有谁知道如何解决?
  • Play 2.3.4 版本也面临同样的问题。这是堆栈跟踪 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: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.罐子:na]
【解决方案2】:

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

【讨论】:

  • 我正走在同一条轨道上,但发生错误的代码是在 org.hibernate.annotations.Table 类型的引用上调用 indexes()
  • 那么您可能没有查看正确的代码。见github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…
  • @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.persistencejavax.persistence-api2.2依赖>
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    mvn dependency:tree >dep.txt
    

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        希望对某人有所帮助。

        【讨论】:

          【解决方案7】:

          我在我的 Spring Boot 应用程序中遇到了同样的问题。从 lib 文件夹中手动删除 javax.persistance.jar 文件后。问题已解决。在 pom.xml 文件中,我只遵循依赖关系

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

          【讨论】:

            【解决方案8】:

            我遇到了同样的问题,我通过在 Entity 类中使​​用 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
            

            【讨论】:

              【解决方案9】:

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

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

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

              如果您的类路径中只有一个依赖项,那么应用服务器的类加载器可能是问题所在。

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

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

              1. 删除应用服务器库路径中有问题的 jar。请谨慎行事,因为它可能会破坏其他托管应用程序。

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

              1. 添加共享库。并手动将 jars 添加到应用服务器的路径中。 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

              【讨论】:

                猜你喜欢
                • 2014-12-24
                • 1970-01-01
                • 1970-01-01
                • 2014-12-28
                • 2019-11-26
                • 2015-03-24
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多