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

У меня есть приложение Play Framework, и я использовал Hibernate 4.2.5.Final(который извлекается через менеджер зависимостей Maven). Я решил перейти на Hibernate 4.3.0.Final, успешно перекомпилировать приложение и запустить его.

Я получил исключение ниже и не смог понять, почему. Я понизился до 4.2.5, и эта проблема не возникла. Затем я попытался обновить Hibernate с каждым финальным релизом после 4.2.5. То есть, я пошел от 4.2.5. Final до 4.2.6. Final, до 4.2.7. Final, до 4.2.8.Final, а затем до 4.3.Final. Проблема не возникает, пока я не перейду к 4.3.0.Final.

Информация о версии 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)

И исключение:

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

Я столкнулся с той же проблемой. Вопрос здесь в том, что play-java-jpa artifact (ключ javaJpa в файле build.sbt) зависит от другой версии spec (version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final").

Когда вы добавили hibernate-entitymanager 4.3, это привело к появлению более новой спецификации (2.1) и другого поставщика factory для entitymanager. В основном у вас есть оба бана в пути класса как транзитивные зависимости.

Измените файл build.sbt таким образом, и он временно устранит вашу проблему, пока воспроизведение не выпустит новую версию плагина jpa для более новой зависимости api.

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

Это для play 2.2.x. В предыдущих версиях были некоторые различия в файлах сборки.

Ответ 2

Hibernate 4.3 - первая версия для реализации спецификации JPA 2.1 (часть Java EE 7). И поэтому он ожидает библиотеку JPA 2.1 в пути к классам, а не в библиотеке JPA 2.0. Вот почему вы получаете это исключение: Table.indexes() - это новый атрибут таблицы, представленный в JPA 2.1

Ответ 3

Вероятно, у вас есть две разные версии hibernate-jpa-api в пути к классам. Чтобы проверить этот прогон:

mvn dependency:tree >dep.txt

Затем выполните поиск, если есть hibernate-jpa-2.0-api и hibernate-jpa-2.1-api. И исключите лишний.

Ответ 4

Я обновляю JPY для Hibernate до 2.1 и работает.

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

Ответ 5

Я мог бы решить проблему, просто заменив файл api jar JPA, в котором находится jboss7/modules/javax/persistence/api/main с 'hibernate-jpa-2.1-api'. также с обновлением module.xml в каталоге.

Ответ 6

Ошибка: java.lang.NoSuchMethodError: javax.persistence.JoinTable.indexes() [Ljavax/persistence/Index;

Единственное, что разрешило мою проблему, - удалить следующую зависимость в pom.xml:   <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>

И замените его на:

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

Надеюсь, что это поможет кому-то.