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.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
Ви називаєте метод, якого не існує в новішій версії
Брайан Роуч

Відповіді:


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. В основному ви отримали обидва банки в шляху до класу як транзитивні залежності.

Відредагуйте свій файл 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/…
musubi

4
Дякую! для Maven користувачів: це означає , що просто не використовувати <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> більше
дуб

4
Для hibernate-jpa-2.0-apiHibernate 4.2.8.FinalVersion is work 4.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]
Ketan Khairnar

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.
Sotirios Delimanolis

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

Я міг би вирішити проблему, просто замінивши файл JPA api jar, який знаходиться jboss7 / modules / javax / persistence / api / main на 'hibernate-jpa-2.1-api'. також з оновленням модуля.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 на наявність залежностей, використовуючи команду, згадану тут https://stackoverflow.com/a/47474708/3333878

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

Якщо у вас лише одна залежність у шляху до вашого класу, то проблема може бути у завантажувачі класів сервера додатків.

Оскільки сервери додатків JavaEE, такі як Websphere, Wildfly, Tomee тощо, мають власні реалізації JPA та інших стандартів EE, навантажувач Class може завантажувати власну реалізацію, замість того, щоб вибирати із шляху до вашого класу у файлі 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. Додайте спільну бібліотеку. і вручну додайте банки до шляху сервера додатків. 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.