web-dev-qa-db-fra.com

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

J'ai une application Play Framework et je utilisais sous 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 l'exception ci-dessous, et n'ai pas pu comprendre pourquoi. J'ai rétrogradé à 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. C’est-à-dire que 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 jusqu'à ce que je mette à niveau vers 4.3.0.Final.

Informations de 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]
80
musubi

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 amené la nouvelle spécification (2.1) et un fournisseur de fabrique différent pour entitymanager. En gros, vous avez fini par avoir les deux jars dans le chemin de classe comme dépendances transitives.

Éditez votre fichier build.sbt de cette manière et cela résoudra temporairement votre problème jusqu'à ce que play publie une nouvelle version du plugin jpa pour la nouvelle dépendance de l'API.

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

Ceci est pour play 2.2.x. Dans les versions précédentes, il y avait quelques différences dans les fichiers de construction.

78
hcura

Hibernate 4.3 est la première version à implémenter la spécification JPA 2.1 (partie de Java EE 7). Et on 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.

70
JB Nizet

Vous avez probablement 2 versions différentes de hibernate-jpa-api sur le classpath. Pour vérifier cette course:

mvn dependency:tree >dep.txt

Puis recherchez s'il existe hibernate-jpa-2.0-api et hibernate-jpa-2.1-api. Et exclure l'excès.

13
Xelian

Je mets à jour mon JPA Hibernate à la version 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>
13
Herbert Rausch

Je pourrais résoudre le problème simplement en remplaçant le fichier JPA api jar qui se trouve jboss7/modules/javax/persistence/api/main par «hibernate-jpa-2.1-api». également avec la mise à jour du module.xml dans le répertoire.

6
sinihong

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.

3
Marceloni Lima

j'ai rencontré le même problème dans mon application de démarrage de printemps. après avoir supprimé manuellement le fichier javax.persistance.jar du dossier lib. problème a été corrigé. dans le fichier pom.xml je suis resté après la dépendance seulement

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