NoSuchMethodError en javax.persistence.Table.indexes()[Ljavax/persistence/Index
hibernate jpa (6)
Tengo una aplicación Play Framework y estaba usando Hibernate 4.2.5.Final (que se recupera a través del administrador de dependencias Maven). Decidí actualizar a Hibernate 4.3.0.Final, recompilar mi aplicación con éxito y ejecutarla.
Obtuve la excepción a continuación, y no he podido averiguar por qué. Bajé de categoría a 4.2.5 y este problema no ocurrió. Luego, intenté actualizar Hibernate con cada lanzamiento 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]
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>
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ázalo por:
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
</dependency>
Espero que ayude a alguien.
Hibernate 4.3 es la primera versión en implementar la especificación JPA 2.1 (parte de Java EE 7). Y por lo tanto, está esperando la biblioteca JPA 2.1 en el classpath, no en la biblioteca JPA 2.0. Es por eso que obtienes esta excepción: Table.indexes () es un nuevo atributo de Table, introducido en JPA 2.1
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 nueva especificación (2.1) y un proveedor de fábrica diferente para el entitymanager. Básicamente terminaste teniendo ambos jar en la classpath como dependencias transitivas.
Edite su archivo build.sbt de esta manera y solucionará temporalmente su problema hasta que Play publique una nueva versión del plugin jpa para la nueva dependencia de la API.
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.
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.
Probablemente tengas 2 versiones diferentes de hibernate-jpa-api en classpath. Para verificar esa ejecución:
mvn dependency:tree >dep.txt
Luego busque si hay hibernate-jpa-2.0-api e hibernate-jpa-2.1-api. Y excluir el exceso.