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

85

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]
musubi
la source
1
Vous appelez une méthode qui n'existe pas dans la version plus récente
Brian Roach

Réponses:

79

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.

hcura
la source
1
Génial, cela a fonctionné! Merci. Pour référence future, voici un lien vers la documentation pour l'exclusion des dépendances transitives: scala-sbt.org/0.12.2/docs/Detailed-Topics/…
musubi
4
Merci! pour les utilisateurs Maven: cela signifie que l' utilisation juste ne <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> plus
chêne
4
Pour hibernate-jpa-2.0-apiHibernate 4.2.8.FinalVersion, le travail 4.3.0.Finalgénère également une erreur.
Harmeet Singh Taara
On 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" )lance toujours NoSuchMethodException NoSuchMethodError:javax.persistence.JoinTable.indexes()Quelqu'un sait comment résoudre?
FrancescoM
Suis également confronté au même problème avec la version Play 2.3.4. Voici la trace de la pile play.api.UnexpectedException: Exception inattendue [NoSuchMethodError: javax.persistence.Table.indexes () [Ljavax / persistence / Index;] sur 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] sur 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] sur scala.Option.map (Option.scala: 145) ~ [scala-library-2.11.1. jar: na]
Ketan Khairnar
71

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

JB Nizet
la source
J'allais sur la même piste mais le code où l'erreur se produit fait appel indexes()à une référence de type org.hibernate.annotations.Table.
Sotirios Delimanolis
1
Vous ne regardez probablement pas le bon code, alors. Voir github.com/hibernate/hibernate-orm/blob/4.3.0.Final
JB Nizet
1
@JBNizet JPA 2.1 est-il uniquement disponible dans Java EE 7 et non dans SE 7? Et je suppose que JPA 2.0 est disponible dans Java SE 7?
musubi
2
@JBNizet alors quelle est la solution. Puis-je passer de java EE à 7 ou puis-je changer JPA 2.0 en JPA 2.1 ?? Si je fais cela donne une erreur ..
Shailendra Madda
1
<! - mvnrepository.com/artifact/javax.persistence/… -> <dependency> <groupId> javax.persistence </groupId> <artifactId> javax.persistence-api </artifactId> <version> 2.2 </ version > </dependency>
bula
15

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

mvn dependency:tree >dep.txt

Cherchez ensuite s'il y a hibernate-jpa-2.0-api et hibernate-jpa-2.1-api. Et excluez l'excédent.

Xelian
la source
14

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>
Herbert Rausch
la source
6

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.

sinihong
la source
4

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.

Marceloni Lima
la source
0

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

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

J'ai eu le même problème, je l'ai résolu en utilisant l' org.hibernate.annotations.Tableannotation au lieu de javax.persistence.Tablela classe Entity.

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

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

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.

  1. Suppression du fichier jar incriminé dans le chemin de la bibliothèque des serveurs d'applications. Procédez avec prudence, car cela pourrait endommager d'autres applications hébergées.

Dans Tomee 1.7.5 Plume / Web, il aura été regroupé eclipselink-2.4.2dans le libdossier à l'aide de JPA 2.0, mais j'ai dû utiliser JPA 2.1 org.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.

  1. Ajoutez une bibliothèque partagée. et ajoutez manuellement des fichiers JAR au chemin du serveur d'applications. Websphere a cette option.

  2. 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

abitcode
la source