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]
java
playframework-2.0
hibernate-4.x
Musubi
quelle
quelle
Antworten:
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.
Dies ist für
play 2.2.x
. In früheren Versionen gab es einige Unterschiede in den Build-Dateien.quelle
<groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId>
nicht mehr verwendenhibernate-jpa-2.0-api
Ruhezustand4.2.8.Final
ist die Arbeit4.3.0.Final
auch ein Fehler.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?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
quelle
indexes()
eine Referenz vom Typ auforg.hibernate.annotations.Table
.Sie haben wahrscheinlich 2 verschiedene Versionen von hibernate-jpa-api im Klassenpfad. So überprüfen Sie diesen Lauf:
Suchen Sie dann, ob es hibernate-jpa-2.0-api und hibernate-jpa-2.1-api gibt. Und schließen Sie den Überschuss aus.
quelle
Ich aktualisiere meinen Hibernate JPA auf 2.1 und es funktioniert.
quelle
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.
quelle
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:
Hoffe es hilft jemandem.
quelle
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
quelle
Ich hatte das gleiche Problem und habe es mithilfe von
org.hibernate.annotations.Table
Anmerkungen anstellejavax.persistence.Table
der Entitätsklasse behoben .quelle
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.
In Tomee 1.7.5 Plume / Web wurde es mit JPA 2.0
eclipselink-2.4.2
imlib
Ordner gebündelt , aber ich musste JPA 2.1 aus verwendenorg.hibernate:hibernate-core:5.1.17
, also das Eclipselink-JAR entfernen und alle verwandten / transitiven Abhängigkeiten aus dem Ruhezustand hinzufügen.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.
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
quelle