2013-12-22 1 views
76

У меня есть приложение Play Framework, а я был с использованием Hibernate 4.2.5.Final (который извлекается через менеджер зависимостей Maven). Я решил перейти на Hibernate 4.3.0.Final, перекомпилировать свое приложение и запустить его.NoSuchMethodError в javax.persistence.Table.indexes() [Ljavax/persistence/Index

Я получил исключение ниже и не смог понять, почему. Я понизился до 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

Вы вызываете метод, который не существует в новой версии –

ответ

74

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

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

Редактируйте файл 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. В предыдущих версиях были некоторые различия в файлах сборки.

+1

Удивительно, это сработало! Благодарю. Для дальнейшего использования здесь приведена ссылка на документацию для исключения транзитивных зависимостей: http://www.scala-sbt.org/0.12.2/docs/Detailed-Topics/Library-Management.html#exclude-transitive-dependencies – musubi

+2

спасибо ! для пользователей maven: это означает просто не использовать ' org.hibernate.java-persistence jpa-api' no no – oak

+0

Спасибо за указание этого! – ossys

63

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

+0

я шел один и тот же трек, но кода, где ошибка происходит в вызове 'индексов()' на качестве ссылки типа 'орг .hibernate.annotations.Table'. –

+0

@SotiriosDelimanolis: ошибка 'NoSuchMethodError: javax.persistence.Table.indexes()'. –

+0

Я знаю, поэтому я этого не понимаю. –

12

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

mvn dependency:tree >dep.txt 

Тогда поиск, если есть спящий режим-JPA-2,0-апи и зимовать-JPA-2,1-апи. И исключить лишний.

6

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

0

Ошибка: 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> 

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

9

Я обновляю свой Hibernate JPA до 2.1, и он работает.

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

Thumbs Up! Это сработало для меня (Y) :) – DivyaMenon

Смежные вопросы