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


85

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

У меня есть исключение ниже, и я не могу понять, почему. Я вернулся к версии 4.2.5, и этой проблемы не возникло. Затем я пробовал обновлять Hibernate с каждым финальным выпуском после 4.2.5. То есть я перешел с 4.2.5.Финал на 4.2.6.Финал, на 4.2.7.Финал, на 4.2.8.Финал, а затем на 4.3.Финал. Проблема не возникает, пока я не обновлюсь до 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
Вы вызываете метод, которого нет в новой версии,
Брайан Роуч,

Ответы:


79

Я столкнулся с той же проблемой. Вопрос в том, что артефакт play-java-jpa (ключ 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) и другой поставщик фабрики для entitymanager. По сути, у вас в пути к классам были оба jar-файла в качестве транзитивных зависимостей.

Отредактируйте файл build.sbt следующим образом, и он временно решит вашу проблему, пока play не выпустит новую версию плагина 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
Круто, сработало! Спасибо. Для справки в будущем, здесь есть ссылки на документацию для исключения зависимостей переходных: scala-sbt.org/0.12.2/docs/Detailed-Topics/...
мусубите

4
Благодарность! для Maven пользователей: это означает , что просто не использовать <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> больше
дуб

4
Для версии hibernate-jpa-2.0-apiHibernate также выдает ошибку. 4.2.8.Final4.3.0.Final
Harmeet Singh Taara

В 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" )все еще выкидывает NoSuchMethodException NoSuchMethodError:javax.persistence.JoinTable.indexes()Кто-нибудь знает, как решить?
FrancescoM

Я также сталкиваюсь с той же проблемой с версией Play 2.3.4. Вот трассировка стека play.api.UnexpectedException: Неожиданное исключение [NoSuchMethodError: javax.persistence.Table.indexes () [Ljavax / persistence / Index;] в 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] в play.core.ReloadableApplication $$ anonfun $ get $ 1 $$ anonfun $ apply $ 1 $$ anonfun $ 1.apply (ApplicationProvider.scala: 130) ~ [play_2.11-2.3.4.jar: 2.3.4] в scala.Option.map (Option.scala: 145) ~ [scala-library-2.11.1. jar: na]
Кетан Хайрнар

71

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


Я шел по тому же пути, но код, в котором возникает ошибка, вызывает indexes()ссылку типа org.hibernate.annotations.Table.
Сотириос Делиманолис

1
Тогда вы, вероятно, смотрите не на правильный код. См. Github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…
JB Nizet

1
@JBNizet Доступен ли JPA 2.1 только в Java EE 7, но не в SE 7? И я предполагаю, что JPA 2.0 доступен в Java SE 7?
musubi

2
@JBNizet, так каково же решение. Могу ли я изменить Java EE на 7 или я могу изменить JPA 2.0 на JPA 2.1 ?? Если я это сделаю, то выдаст ошибку ..
Шайлендра Мадда

1
<! - mvnrepository.com/artifact/javax.persistence/… -> <dependency> <groupId> javax.persistence </groupId> <artifactId> javax.persistence-api </artifactId> <version> 2.2 </ version > </dependency>
була

15

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

mvn dependency:tree >dep.txt

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


14

Я обновляю свой 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>

6

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


4

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

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


0

У меня возникла такая же проблема в моем приложении весенней загрузки. после удаления вручную файла javax.persistance.jar из папки lib. проблема была исправлена. в файле pom.xml я остался только после зависимости

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

0

У меня была такая же проблема, я исправил ее, используя org.hibernate.annotations.Tableаннотацию вместо javax.persistence.Tableкласса Entity.

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

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

0

В вашем пути к классам есть несколько поставщиков JPA. Или, по крайней мере, в папке lib вашего сервера приложений.

Если вы используете Maven Check for dependencies, используя команду, указанную здесь https://stackoverflow.com/a/47474708/3333878

Затем исправьте, удалив / исключив нежелательную зависимость.

Если у вас только одна зависимость в пути к классам, проблема может быть в загрузчике классов сервера приложений.

Поскольку серверы приложений JavaEE, такие как Websphere, Wildfly, Tomee и т. Д., Имеют свои собственные реализации JPA и других стандартов EE, загрузчик классов может загружать свою собственную реализацию вместо выбора из пути к классам в файле WAR / EAR.

Чтобы избежать этого, вы можете попробовать следующие шаги.

  1. Удаление ошибочного jar в пути к библиотеке серверов приложений. Соблюдайте осторожность, так как это может нарушить работу других размещенных приложений.

В Tomee 1.7.5 Plume / Web он будет связан eclipselink-2.4.2в libпапке с использованием JPA 2.0, но мне пришлось использовать JPA 2.1 из org.hibernate:hibernate-core:5.1.17, поэтому удалил банку eclipselink и добавил все связанные / транзитивные зависимости из ядра спящего режима.

  1. Добавить общую библиотеку. и вручную добавить jar-файлы на путь к серверу приложений. У Websphere есть такая возможность.

  2. В Websphere можно изменить выполнение загрузчика классов. так что путь к классам сервера приложений должен загружаться последним, то есть родительский - последним и ваш путь загружается первым. Это можно решить.

Прежде чем переходить к первому пункту, проверьте, есть ли у вашего сервера приложений указанные выше функции.

Ссылки 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.