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

85

Tengo una aplicación Play Framework y estaba usando Hibernate 4.2.5.Final (que se recupera a través del administrador de dependencias de Maven). Decidí actualizar a Hibernate 4.3.0.Final, recompilar mi aplicación con éxito y ejecutarla.

Recibí la excepción a continuación y no he podido averiguar por qué. Bajé de nuevo a 4.2.5 y este problema no ocurrió. Luego, intenté actualizar Hibernate con cada versión final después de 4.2.5. Es decir, pasé de 4.2.5.Final a 4.2.6.Final, a 4.2.7.Final, a 4.2.8.Final y luego a 4.3.Final. El problema no ocurre hasta que actualizo a 4.3.0.Final.

Información de la versión de 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)

Y excepción :

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
fuente
1
Estás llamando a un método que no existe en la versión más reciente
Brian Roach

Respuestas:

79

Me encontré con el mismo problema. La pregunta aquí es que el artefacto play-java-jpa (clave javaJpa en el archivo build.sbt) depende de una versión diferente de la especificación (version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final").

Cuando agregó hibernate-entitymanager 4.3, esto trajo la especificación más reciente (2.1) y un proveedor de fábrica diferente para el entitymanager. Básicamente, terminó teniendo ambos archivos jar en el classpath como dependencias transitivas.

Edite su archivo build.sbt de esta manera y solucionará temporalmente su problema hasta que el juego lance una nueva versión del complemento jpa para la dependencia api más nueva.

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

Esto es para play 2.2.x. En versiones anteriores había algunas diferencias en los archivos de compilación.

hcura
fuente
1
¡Impresionante, funcionó! Gracias. Para referencia futura, aquí hay un enlace a la documentación para excluir dependencias transitivas: scala-sbt.org/0.12.2/docs/Detailed-Topics/…
musubi
4
¡Gracias! para usuarios de maven: significa simplemente no usar <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> más
roble
4
Para la versión de hibernate-jpa-2.0-apiHibernate, el 4.2.8.Finaltrabajo 4.3.0.Finaltambién arroja un error.
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" )sigue lanzando NoSuchMethodException ¿ NoSuchMethodError:javax.persistence.JoinTable.indexes()Alguien sabe cómo resolverlo?
FrancescoM
También estoy enfrentando el mismo problema con la versión Play 2.3.4. Aquí está el seguimiento de la pila play.api.UnexpectedException: Excepción inesperada [NoSuchMethodError: javax.persistence.Table.indexes () [Ljavax / persistence / Index;] en 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] en play.core.ReloadableApplication $$ anonfun $ get $ 1 $$ anonfun $ aplicar $ 1 $$ anonfun $ 1.apply (ApplicationProvider.scala: 130) ~ [play_2.11-2.3.4.jar: 2.3.4] en scala.Option.map (Option.scala: 145) ~ [scala-library-2.11.1. jar: na]
Ketan Khairnar
71

Hibernate 4.3 es la primera versión que implementa la especificación JPA 2.1 (parte de Java EE 7). Y, por lo tanto, espera la biblioteca JPA 2.1 en la ruta de clases, no la biblioteca JPA 2.0. Es por eso que obtiene esta excepción: Table.indexes () es un nuevo atributo de Table, introducido en JPA 2.1

JB Nizet
fuente
Iba por la misma pista, pero el código donde ocurre el error está llamando indexes()a una referencia de tipo org.hibernate.annotations.Table.
Sotirios Delimanolis
1
Probablemente no estés viendo el código correcto, entonces. Ver github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…
JB Nizet
1
@JBNizet ¿JPA 2.1 solo está disponible en Java EE 7 y no en SE 7? ¿Y supongo que JPA 2.0 está disponible en Java SE 7?
musubi
2
@JBNizet entonces cuál es la solución. ¿Puedo cambiar a Java EE a 7 o puedo cambiar JPA 2.0 a JPA 2.1? Si lo hago me da error ..
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

Probablemente tenga 2 versiones diferentes de hibernate-jpa-api en el classpath. Para comprobar esa ejecución:

mvn dependency:tree >dep.txt

Luego busque si hay hibernate-jpa-2.0-api e hibernate-jpa-2.1-api. Y excluye el exceso.

Xelian
fuente
14

Actualizo mi Hibernate JPA a 2.1 y funciona.

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

Podría resolver el problema simplemente reemplazando el archivo JPA api jar que se encuentra jboss7 / modules / javax / persistence / api / main con 'hibernate-jpa-2.1-api'. también con la actualización de module.xml en el directorio.

sinihong
fuente
4

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

Lo único que resolvió mi problema fue eliminar la siguiente dependencia en pom.xml: <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>

Y reemplácelo por:

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

Espero que ayude a alguien.

Marceloni Lima
fuente
0

He experimentado el mismo problema en mi aplicación de arranque de primavera. después de eliminar manualmente el archivo javax.persistance.jar de la carpeta lib. se solucionó el problema. en el archivo pom.xml he permanecido siguiendo solo la dependencia

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

Tuve el mismo problema, lo solucioné usando una org.hibernate.annotations.Tableanotación en lugar de javax.persistence.Tableen la clase Entity.

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

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

Hay varios proveedores de JPA en su classpath. O al menos en la carpeta lib del servidor de aplicaciones.

Si está usando Maven, verifique las dependencias usando el comando mencionado aquí https://stackoverflow.com/a/47474708/3333878

Luego, corrija eliminando / excluyendo la dependencia no deseada.

Si solo tiene una dependencia en su classpath, entonces el cargador de clases del servidor de aplicaciones podría ser el problema.

Dado que los servidores de aplicaciones JavaEE como Websphere, Wildfly, Tomee, etc., tienen sus propias implementaciones de JPA y otros estándares EE, el cargador de clases puede cargar su propia implementación en lugar de elegir su ruta de clases en el archivo WAR / EAR.

Para evitar esto, puede intentar los pasos a continuación.

  1. Eliminando el jar ofensivo en la ruta de la biblioteca de Application Servers Proceda con precaución, ya que podría dañar otras aplicaciones alojadas.

En Tomee 1.7.5 Plume / Web se habrá incluido eclipselink-2.4.2en la libcarpeta usando JPA 2.0, pero tuve que usar JPA 2.1 de org.hibernate:hibernate-core:5.1.17, así que eliminé el jar eclipselink y agregué todas las dependencias relacionadas / transitivas del núcleo de hibernación.

  1. Agrega una biblioteca compartida. y agregue jarras manualmente a la ruta del servidor de aplicaciones. Websphere tiene esta opción.

  2. En Websphere, la ejecución del cargador de clases se puede cambiar. por lo que hacer que la ruta de clase del servidor de aplicaciones se cargue en último lugar, es decir, el padre en último lugar y la ruta de acceso se cargue primero. Puede resolver esto.

Verifique si su servidor de aplicaciones tiene las características anteriores, antes de continuar con el primer punto.

Referencias de 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
fuente