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


85

Ho un'applicazione Giocare quadro e mi stavo usando Hibernate 4.2.5.Final (che viene recuperato tramite il responsabile della dipendenza Maven). Ho deciso di aggiornare a Hibernate 4.3.0.Final, ricompilare la mia applicazione con successo e di eseguirla.

Ho l'eccezione di seguito e non sono riuscito a capire perché. Ho eseguito il downgrade a 4.2.5 e questo problema non si è verificato. Ho quindi provato ad aggiornare Hibernate con ogni versione finale dopo la 4.2.5. Cioè, sono passato da 4.2.5.Final a 4.2.6.Final, a 4.2.7.Final, a 4.2.8.Final e poi a 4.3.Final. Il problema non si verifica fino a quando non eseguo l'aggiornamento a 4.3.0.Final.

Informazioni sulla versione 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)

Ed eccezione :

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]

1
Stai chiamando un metodo che non esiste nella versione più recente
Brian Roach

Risposte:


79

Ho riscontrato lo stesso problema. La domanda qui è che l'artefatto play-java-jpa (chiave javaJpa nel file build.sbt) dipende da una versione diversa della specifica (version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final").

Quando hai aggiunto hibernate-entitymanager 4.3, questo ha portato la specifica più recente (2.1) e un diverso provider di fabbrica per entitymanager. Fondamentalmente hai finito per avere entrambi i jar nel classpath come dipendenze transitive.

Modifica il tuo file build.sbt in questo modo e risolverai temporaneamente il problema fino a quando Play non rilascerà una nuova versione del plug-in jpa per la nuova dipendenza api.

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

Questo è per play 2.2.x. Nelle versioni precedenti c'erano alcune differenze nei file di build.


1
Fantastico, ha funzionato! Grazie. Per riferimento futuro, ecco un collegamento alla documentazione per escludere le dipendenze transitive: scala-sbt.org/0.12.2/docs/Detailed-Topics/…
musubi

4
Grazie! per utenti esperti: significa semplicemente non usarne <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> più
quercia

4
Per la versione hibernate-jpa-2.0-apiHibernate 4.2.8.Finalè lavoro 4.3.0.Finalanche lanciare un errore.
Harmeet Singh Taara

Su 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" )sta ancora lanciando NoSuchMethodException NoSuchMethodError:javax.persistence.JoinTable.indexes()Qualcuno sa come risolvere?
FrancescoM

Sto anche affrontando lo stesso problema con la versione Play 2.3.4. Ecco lo stack trace play.api.UnexpectedException: Eccezione imprevista [NoSuchMethodError: javax.persistence.Table.indexes () [Ljavax / persistence / Index;] su 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] su play.core.ReloadableApplication $$ anonfun $ ricevi $ 1 $$ anonfun $ applica $ 1 $$ anonfun $ 1.apply (ApplicationProvider.scala: 130) ~ [play_2.11-2.3.4.jar: 2.3.4] su scala.Option.map (Option.scala: 145) ~ [scala-library-2.11.1. jar: na]
Ketan Khairnar

71

Hibernate 4.3 è la prima versione ad implementare la specifica JPA 2.1 (parte di Java EE 7). E quindi si aspetta la libreria JPA 2.1 nel classpath, non la libreria JPA 2.0. Ecco perché ottieni questa eccezione: Table.indexes () è un nuovo attributo di Table, introdotto in JPA 2.1


Stavo seguendo la stessa traccia ma il codice in cui si verifica l'errore sta chiamando indexes()un riferimento di tipo org.hibernate.annotations.Table.
Sotirios Delimanolis

1
Probabilmente non stai guardando il codice giusto, allora. Vedi github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…
JB Nizet

1
@JBNizet JPA 2.1 è disponibile solo in Java EE 7 e non in SE 7? E immagino che JPA 2.0 sia disponibile in Java SE 7?
musubi

2
@JBNizet quindi qual è la soluzione. Posso passare a Java EE a 7 o posso cambiare JPA 2.0 in JPA 2.1? Se lo faccio dà errore ..
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

Probabilmente hai 2 diverse versioni di hibernate-jpa-api sul classpath. Per controllare quella corsa:

mvn dependency:tree >dep.txt

Quindi cerca se sono presenti hibernate-jpa-2.0-api e hibernate-jpa-2.1-api. Ed escludi quello in eccesso.


14

Aggiorno il mio Hibernate JPA a 2.1 e funziona.

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

6

Potrei risolvere il problema semplicemente sostituendo il file jar api JPA che si trova jboss7 / modules / javax / persistenza / api / main con 'hibernate-jpa-2.1-api'. anche con l'aggiornamento module.xml nella directory.


4

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

L'unica cosa che ha risolto il mio problema è stata la rimozione della seguente dipendenza in pom.xml: <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>

E sostituiscilo con:

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

Spero che aiuti qualcuno.


0

ho riscontrato lo stesso problema nella mia applicazione di avvio primaverile. dopo aver rimosso manualmente il file javax.persistance.jar dalla cartella lib. il problema è stato risolto. nel file pom.xml sono rimasto solo seguendo la dipendenza

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

0

Ho avuto lo stesso problema, l'ho risolto usando l' org.hibernate.annotations.Tableannotazione invece che javax.persistence.Tablenella classe Entity.

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

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

0

Ci sono più provider JPA nel tuo classpath. O almeno nella cartella lib del server delle applicazioni.

Se stai usando Maven Controlla le dipendenze usando il comando menzionato qui https://stackoverflow.com/a/47474708/3333878

Quindi risolvere rimuovendo / escludendo la dipendenza indesiderata.

Se si dispone solo di una dipendenza nel percorso di classe, il problema potrebbe essere il programma di caricamento classi del server delle applicazioni.

Poiché i server delle applicazioni JavaEE come Websphere, Wildfly, Tomee ecc., Hanno le proprie implementazioni di JPA e altri standard EE, il Class loader potrebbe caricare la propria implementazione invece di scegliere dal proprio percorso di classe nel file WAR / EAR.

Per evitare ciò, puoi provare i passaggi seguenti.

  1. Rimozione del jar offensivo nel percorso della libreria dei server delle applicazioni. Procedi con cautela, in quanto potrebbe rompere altre applicazioni ospitate.

In Tomee 1.7.5 Plume / Web sarà raggruppato eclipselink-2.4.2nella libcartella usando JPA 2.0, ma ho dovuto usare JPA 2.1 da org.hibernate:hibernate-core:5.1.17, quindi ho rimosso il jar eclipselink e aggiunto tutte le dipendenze correlate / transitive dal core di ibernazione.

  1. Aggiungi una libreria condivisa. e aggiungi manualmente i jar al percorso del server dell'app. Websphere dispone di questa opzione.

  2. In Websphere, è possibile modificare l'esecuzione del programma di caricamento classi. quindi facendo in modo che il classpath del server delle applicazioni venga caricato per ultimo, ovvero il genitore per ultimo e il percorso venga caricato per primo. Può risolvere questo problema.

Controlla se il tuo server delle app ha le funzionalità di cui sopra, prima di procedere con il primo punto.

Riferimenti su 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.