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


85

私はプレイFrameworkアプリケーションを持っていると私はした(Mavenの依存性マネージャを介して検索される)休止4.2.5.Finalを使用します。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

回答:


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
すごい、うまくいった!ありがとう。今後の参考のために、推移的な依存関係を除外するためのドキュメントへのリンクを次に示し
musubi

4
ありがとう!Mavenユーザーの場合:これ<groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> 以上使用しないことを意味します
オーク

4
以下のためhibernate-jpa-2.0-apiにHibernate4.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" )ではまだNoSuchMethodExceptionがスローされNoSuchMethodError:javax.persistence.JoinTable.indexes()ています誰もが解決する方法を知っていますか?
FrancescoM

Play2.3.​​4バージョンでも同じ問題に直面しています。これがスタックトレースですplay.api.UnexpectedException:予期しない例外[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] at 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.0ライブラリではなく、クラスパスにJPA2.1ライブラリが含まれていることが期待されます。この例外が発生するのはそのためです。Table.indexes()は、JPA2.1で導入されたTableの新しい属性です。


私は同じ道を進んでいましたが、エラーが発生するコードindexes()はタイプの参照を呼び出していますorg.hibernate.annotations.Table
Sotirios Delimanolis 2013

1
その場合、おそらく正しいコードを見ていません。github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…を
JB

1
@JBNizet JPA2.1はJavaEE 7でのみ使用でき、SE 7では使用できませんか?そして、JPA2.0はJavaSE 7で利用できると思いますか?
musubi

2
@JBNizetだから、解決策は何ですか。Java EEを7に変更できますか、それともJPA2.0をJPA2.1に変更できますか?私がやるのであればエラーになります。..
シャイレンドラMadda

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

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

jboss7 / modules / javax / persistence / api / mainにあるJPAapijarファイルを「hibernate-jpa-2.1-api」に置き換えるだけで問題を解決できます。また、ディレクトリ内の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

スプリングブートアプリケーションで同じ問題が発生しました。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プロバイダーがあります。または、少なくともアプリケーションサーバーのlibフォルダーにあります。

Mavenを使用している場合ここに記載されているコマンドを使用して依存関係を確認してください くださいhttps://stackoverflow.com/a/47474708/3333878

次に、不要な依存関係を削除/除外して修正します。

クラスパスに依存関係が1つしかない場合は、アプリケーションサーバーのクラスローダーが問題になる可能性があります。

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を削除し、hibernateコアからすべての関連/推移的な依存関係を追加しました。

  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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.