J'ai une application-cadre de lecture et je me sers Hibernate 4.2.5.Final (qui est récupéré via le gestionnaire de dépendances Maven). J'ai décidé de passer à Hibernate 4.3.0.Final, de recompiler mon application avec succès et de l'exécuter.
J'ai eu l'exception ci-dessous et je n'ai pas été en mesure de comprendre pourquoi. J'ai rétrogradé à la version 4.2.5 et ce problème ne s'est pas produit. J'ai ensuite essayé de mettre à niveau Hibernate avec chaque version finale après la version 4.2.5. Autrement dit, je suis passé de 4.2.5.Final à 4.2.6.Final, à 4.2.7.Final, à 4.2.8.Final puis à 4.3.Final. Le problème ne se produit pas tant que je n'ai pas mis à niveau vers la version 4.3.0.Final.
Informations sur la version 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)
Et exception :
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]
Réponses:
J'ai rencontré le même problème. La question ici est que l'artefact play-java-jpa (clé javaJpa dans le fichier build.sbt) dépend d'une version différente de la spécification
(version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final")
.Lorsque vous avez ajouté hibernate-entitymanager 4.3, cela a apporté la nouvelle spécification (2.1) et un fournisseur d'usine différent pour le entitymanager. En gros, vous avez fini par avoir les deux fichiers JAR dans le classpath en tant que dépendances transitives.
Modifiez votre fichier build.sbt comme ceci et cela résoudra temporairement votre problème jusqu'à ce que play publie une nouvelle version du plugin jpa pour la nouvelle dépendance api.
libraryDependencies ++= Seq( javaJdbc, javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"), "org.hibernate" % "hibernate-entitymanager" % "4.3.0.Final" )
C'est pour
play 2.2.x
. Dans les versions précédentes, il y avait des différences dans les fichiers de construction.la source
<groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId>
plushibernate-jpa-2.0-api
Hibernate4.2.8.Final
Version, le travail4.3.0.Final
génère également une erreur.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" )
lance toujours NoSuchMethodExceptionNoSuchMethodError:javax.persistence.JoinTable.indexes()
Quelqu'un sait comment résoudre?Hibernate 4.3 est la première version à implémenter la spécification JPA 2.1 (partie de Java EE 7). Et il attend donc la bibliothèque JPA 2.1 dans le chemin de classe, pas la bibliothèque JPA 2.0. C'est pourquoi vous obtenez cette exception: Table.indexes () est un nouvel attribut de Table, introduit dans JPA 2.1
la source
indexes()
à une référence de typeorg.hibernate.annotations.Table
.Vous avez probablement 2 versions différentes de hibernate-jpa-api sur le chemin de classe. Pour vérifier cette course:
Cherchez ensuite s'il y a hibernate-jpa-2.0-api et hibernate-jpa-2.1-api. Et excluez l'excédent.
la source
Je mets à jour mon Hibernate JPA vers 2.1 et cela fonctionne.
<dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>
la source
Je pourrais résoudre le problème simplement en remplaçant le fichier jar api JPA qui se trouve jboss7 / modules / javax / persistence / api / main par 'hibernate-jpa-2.1-api'. également avec la mise à jour de module.xml dans le répertoire.
la source
Erreur: java.lang.NoSuchMethodError: javax.persistence.JoinTable.indexes () [Ljavax / persistence / Index;
La seule chose qui a résolu mon problème a été de supprimer la dépendance suivante dans pom.xml:
<dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>
Et remplacez-le pour:
<dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0.2</version> </dependency>
J'espère que ça aide quelqu'un.
la source
J'ai rencontré le même problème dans mon application Spring Boot. après avoir supprimé manuellement le fichier javax.persistance.jar du dossier lib. le problème a été résolu. dans le fichier pom.xml je suis resté à la suite de la dépendance uniquement
la source
J'ai eu le même problème, je l'ai résolu en utilisant l'
org.hibernate.annotations.Table
annotation au lieu dejavax.persistence.Table
la classe Entity.import javax.persistence.Entity; import org.hibernate.annotations.Table; @Entity @Table(appliesTo = "my_table") public class MyTable{ //and rest of the code
la source
Il existe plusieurs fournisseurs JPA dans votre chemin de classe. Ou au moins dans le dossier lib de votre serveur d'applications.
Si vous utilisez Maven Vérifiez les dépendances à l'aide de la commande mentionnée ici https://stackoverflow.com/a/47474708/3333878
Puis corrigez en supprimant / excluant les dépendances indésirables.
Si vous n'avez qu'une seule dépendance dans votre chemin de classe, le chargeur de classe du serveur d'applications peut être le problème.
Comme les serveurs d'applications JavaEE tels que Websphere, Wildfly, Tomee, etc., ont leurs propres implémentations de JPA et d'autres normes EE, le chargeur de classe peut charger sa propre implémentation au lieu de sélectionner votre chemin de classe dans le fichier WAR / EAR.
Pour éviter cela, vous pouvez essayer les étapes ci-dessous.
Dans Tomee 1.7.5 Plume / Web, il aura été regroupé
eclipselink-2.4.2
dans lelib
dossier à l'aide de JPA 2.0, mais j'ai dû utiliser JPA 2.1org.hibernate:hibernate-core:5.1.17
, donc j'ai supprimé le jar eclipselink et ajouté toutes les dépendances liées / transitives du noyau d'hibernation.Ajoutez une bibliothèque partagée. et ajoutez manuellement des fichiers JAR au chemin du serveur d'applications. Websphere a cette option.
Dans Websphere, l'exécution du chargeur de classe peut être modifiée. donc en faisant le chemin de classe du serveur d'application à charger en dernier, c'est-à-dire le parent en dernier et le chargement de votre chemin en premier. Peut résoudre ce problème.
Vérifiez si votre serveur d'applications a les fonctionnalités ci-dessus, avant de passer au premier point.
Références 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
la source