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

85

Ich habe eine Play - Framework - Anwendung , und ich wurde mit Hibernate 4.2.5.Final (die über die Maven Abhängigkeit Manager abgerufen werden). Ich habe mich für ein Upgrade auf Hibernate 4.3.0.Final entschieden, meine Anwendung erfolgreich neu kompiliert und ausgeführt.

Ich habe die folgende Ausnahme und konnte nicht herausfinden, warum. Ich habe ein Downgrade auf 4.2.5 durchgeführt und dieses Problem ist nicht aufgetreten. Ich habe dann versucht, Hibernate mit jeder endgültigen Version nach 4.2.5 zu aktualisieren. Das heißt, ich ging von 4.2.5.Final zu 4.2.6.Final, zu 4.2.7.Final, zu 4.2.8.Final und dann zu 4.3.Final. Das Problem tritt erst auf, wenn ich auf 4.3.0.Final aktualisiere.

Informationen zur Java-Version

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)

Und Ausnahme :

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]
Musubi
quelle
1
Sie rufen eine Methode auf, die in der neueren Version nicht vorhanden ist
Brian Roach

Antworten:

79

Ich bin auf das gleiche Problem gestoßen. Die Frage hier ist, dass das Play-Java-JPA-Artefakt (JavaJpa-Schlüssel in der Datei build.sbt) von einer anderen Version der Spezifikation abhängt (version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final").

Wenn Sie hibernate-entitymanager 4.3 hinzugefügt haben, wurden die neuere Spezifikation (2.1) und ein anderer Factory-Anbieter für den entitymanager hinzugefügt. Grundsätzlich hatten Sie beide Jars im Klassenpfad als transitive Abhängigkeiten.

Bearbeiten Sie Ihre build.sbt-Datei wie folgt und das Problem wird vorübergehend behoben, bis play eine neue Version des jpa-Plugins für die neuere API-Abhängigkeit veröffentlicht.

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

Dies ist für play 2.2.x. In früheren Versionen gab es einige Unterschiede in den Build-Dateien.

hcura
quelle
1
Super, es hat funktioniert! Vielen Dank. Zum späteren Nachschlagen ist hier ein Link zur Dokumentation zum Ausschluss transitiver Abhängigkeiten: scala-sbt.org/0.12.2/docs/Detailed-Topics/…
musubi
3
Vielen Dank! Für Maven-Benutzer: Es bedeutet, dass Sie einfach <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> nicht mehr verwenden
Eiche
4
Für den hibernate-jpa-2.0-apiRuhezustand 4.2.8.Finalist die Arbeit 4.3.0.Finalauch ein Fehler.
Harmeet Singh Taara
On Play 2.2.3 löst 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" )immer noch NoSuchMethodException aus. Weiß NoSuchMethodError:javax.persistence.JoinTable.indexes()jemand, wie man es löst?
FrancescoM
Ich bin auch mit dem gleichen Problem mit Play 2.3.4 Version konfrontiert. Hier ist die Stapelverfolgung play.api.UnexpectedException: Unerwartete Ausnahme [NoSuchMethodError: javax.persistence.Table.indexes () [Ljavax / persistence / Index;] bei 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
71

Hibernate 4.3 ist die erste Version, die die JPA 2.1-Spezifikation (Teil von Java EE 7) implementiert. Daher wird die JPA 2.1-Bibliothek im Klassenpfad erwartet, nicht die JPA 2.0-Bibliothek. Aus diesem Grund erhalten Sie diese Ausnahme: Table.indexes () ist ein neues Attribut von Table, das in JPA 2.1 eingeführt wurde

JB Nizet
quelle
Ich bin den gleichen Weg gegangen, aber der Code, in dem der Fehler auftritt, ruft indexes()eine Referenz vom Typ auf org.hibernate.annotations.Table.
Sotirios Delimanolis
1
Dann suchen Sie wahrscheinlich nicht den richtigen Code. Siehe github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…
JB Nizet
1
@JBNizet Ist JPA 2.1 nur in Java EE 7 und nicht in SE 7 verfügbar? Und ich vermute, JPA 2.0 ist in Java SE 7 verfügbar?
Musubi
2
@JBNizet also was ist die Lösung. Kann ich zu Java EE zu 7 wechseln oder kann ich JPA 2.0 zu JPA 2.1 ändern? Wenn ich das tue, gibt es einen Fehler.
Shylendra Madda
1
<! - mvnrepository.com/artifact/javax.persistence/… -> <dependency> <groupId> javax.persistence </ groupId> <artifactId> javax.persistence-api </ arifactId> <version> 2.2 </ version > </ dependency>
bula
15

Sie haben wahrscheinlich 2 verschiedene Versionen von hibernate-jpa-api im Klassenpfad. So überprüfen Sie diesen Lauf:

mvn dependency:tree >dep.txt

Suchen Sie dann, ob es hibernate-jpa-2.0-api und hibernate-jpa-2.1-api gibt. Und schließen Sie den Überschuss aus.

Xelian
quelle
14

Ich aktualisiere meinen Hibernate JPA auf 2.1 und es funktioniert.

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

Ich könnte das Problem einfach lösen, indem ich die JPA-API-JAR-Datei, die sich in jboss7 / modules / javax / persistence / api / main befindet, durch 'hibernate-jpa-2.1-api' ersetze. auch mit der Aktualisierung von module.xml im Verzeichnis.

Sinihong
quelle
4

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

Das einzige, was mein Problem gelöst hat, war das Entfernen der folgenden Abhängigkeit in pom.xml: <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>

Und ersetzen Sie es für:

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

Hoffe es hilft jemandem.

Marceloni Lima
quelle
0

Ich habe das gleiche Problem in meiner Spring Boot-Anwendung festgestellt. nach dem manuellen Entfernen der Datei javax.persistance.jar aus dem lib-Ordner. Problem wurde behoben. in der pom.xml datei bin ich nur nach abhängigkeit geblieben

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
Damitha Dayananda
quelle
0

Ich hatte das gleiche Problem und habe es mithilfe von org.hibernate.annotations.TableAnmerkungen anstelle javax.persistence.Tableder Entitätsklasse behoben .

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

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

In Ihrem Klassenpfad befinden sich mehrere JPA-Anbieter. Oder zumindest in Ihrem Anwendungsserver lib-Ordner.

Wenn Sie Maven verwenden Verwenden Sie den hier genannten Befehl https://stackoverflow.com/a/47474708/3333878, um nach Abhängigkeiten zu suchen

Beheben Sie das Problem, indem Sie unerwünschte Abhängigkeiten entfernen / ausschließen.

Wenn Sie nur eine Abhängigkeit in Ihrem Klassenpfad haben, ist möglicherweise der Klassenlader des Anwendungsservers das Problem.

Da JavaEE-Anwendungsserver wie Websphere, Wildfly, Tomee usw. über eigene Implementierungen von JPA und anderen EE-Standards verfügen, lädt der Class Loader möglicherweise eine eigene Implementierung, anstatt sie aus Ihrem Klassenpfad in der WAR / EAR-Datei auszuwählen.

Um dies zu vermeiden, können Sie die folgenden Schritte ausführen.

  1. Entfernen des fehlerhaften JAR im Bibliothekspfad der Anwendungsserver. Fahren Sie mit Vorsicht fort, da dies andere gehostete Anwendungen beschädigen kann.

In Tomee 1.7.5 Plume / Web wurde es mit JPA 2.0 eclipselink-2.4.2im libOrdner gebündelt , aber ich musste JPA 2.1 aus verwenden org.hibernate:hibernate-core:5.1.17, also das Eclipselink-JAR entfernen und alle verwandten / transitiven Abhängigkeiten aus dem Ruhezustand hinzufügen.

  1. Fügen Sie eine gemeinsam genutzte Bibliothek hinzu. und fügen Sie dem Pfad des App-Servers manuell Gläser hinzu. Websphere hat diese Option.

  2. In Websphere kann die Ausführung des Klassenladeprogramms geändert werden. Machen Sie es also zum Klassenpfad des Anwendungsservers, der zuletzt geladen wird, dh zuletzt übergeordnet, und lassen Sie Ihren Pfad zuerst laden. Kann das lösen.

Überprüfen Sie, ob Ihr App-Server über die oben genannten Funktionen verfügt, bevor Sie mit dem ersten Punkt fortfahren.

Ibm websphere Referenzen:

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

Abitcode
quelle