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

85

Mam aplikacji play ramowy i był przy użyciu hibernacji 4.2.5.Final (które są pobierane za pośrednictwem kierownika zależności Maven). Zdecydowałem się na aktualizację do Hibernate 4.3.0.Final, ponownie skompilowałem moją aplikację i uruchomiłem ją.

Mam wyjątek poniżej i nie byłem w stanie dowiedzieć się, dlaczego. Obniżyłem z powrotem do 4.2.5 i ten problem nie wystąpił. Następnie próbowałem uaktualnić Hibernate z każdym wydaniem końcowym po 4.2.5. Oznacza to, że przeszedłem z 4.2.5.Final do 4.2.6.Final, do 4.2.7.Final, do 4.2.8.Final, a następnie do 4.3.Final. Problem nie występuje, dopóki nie zaktualizuję do wersji 4.3.0.Final.

Informacje o wersji 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)

I wyjątek :

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]
musubi
źródło
1
Wywołujesz metodę, która nie istnieje w nowszej wersji
Brian Roach

Odpowiedzi:

79

Napotkałem ten sam problem. Chodzi o to, że artefakt play-java-jpa (klucz javaJpa w pliku build.sbt) zależy od innej wersji specyfikacji (version 2.0 -> "org.hibernate.javax.persistence" % "hibernate-jpa-2.0-api" % "1.0.1.Final").

Dodanie programu hibernate-privilymanager 4.3 przyniosło nowszą specyfikację (2.1) i innego dostawcę fabrycznego dla uprawnionego. Zasadniczo skończyło się na posiadaniu obu plików jar w ścieżce klas jako zależności przechodnich.

Edytuj plik build.sbt w ten sposób, a tymczasowo rozwiąże to problem, dopóki play nie wyda nowej wersji wtyczki jpa dla nowszej zależności API.

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

To jest dla play 2.2.x. W poprzednich wersjach były pewne różnice w plikach kompilacji.

hcura
źródło
1
Świetnie, zadziałało! Dzięki. Dla porównania w przyszłości, tutaj jest link do dokumentacji bez zależności przechodnie: scala-sbt.org/0.12.2/docs/Detailed-Topics/...
Musubi
4
dzięki! dla użytkowników maven: oznacza to, że po prostu nie używaj <groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId> więcej
dąb
4
Dla wersji hibernate-jpa-2.0-apiHibernate 4.2.8.Finaldziała 4.3.0.Finalrównież zgłoszenie błędu.
Harmeet Singh Taara
W 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" )nadal rzuca NoSuchMethodException. NoSuchMethodError:javax.persistence.JoinTable.indexes()Ktoś wie, jak rozwiązać?
FrancescoM
Mam również ten sam problem z wersją Play 2.3.4. Oto ślad stosu play.api.UknownException: Nieoczekiwany wyjątek [NoSuchMethodError: javax.persistence.Table.indexes () [Ljavax / persistence / Index;] at 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] na play.core.ReloadableApplication $$ anonfun $ get 1 $ $$ anonfun $ zastosuj 1 $ $$ anonfun $ 1.apply (ApplicationProvider.scala: 130) ~ [play_2.11-2.3.4.jar: 2.3.4] at scala.Option.map (Option.scala: 145) ~ [scala-library-2.11.1. jar: na]
Ketan Khairnar
71

Hibernate 4.3 to pierwsza wersja, w której zaimplementowano specyfikację JPA 2.1 (część Java EE 7). W ten sposób oczekuje biblioteki JPA 2.1 w ścieżce klas, a nie biblioteki JPA 2.0. Dlatego otrzymujesz ten wyjątek: Table.indexes () to nowy atrybut tabeli, wprowadzony w JPA 2.1

JB Nizet
źródło
Szedłem tą samą ścieżką, ale kod, w którym występuje błąd, wywołuje indexes()odwołanie typu org.hibernate.annotations.Table.
Sotirios Delimanolis
1
Prawdopodobnie więc nie patrzysz na właściwy kod. Zobacz github.com/hibernate/hibernate-orm/blob/4.3.0.Final/…
JB Nizet
1
@JBNizet Czy JPA 2.1 jest dostępny tylko w Javie EE 7, a nie w SE 7? I zgaduję, że JPA 2.0 jest dostępny w Javie SE 7?
musubi
2
@JBNizet więc jakie jest rozwiązanie. Czy mogę zmienić na java EE na 7, czy mogę zmienić JPA 2.0 na JPA 2.1? Jeśli to zrobię daje błąd ...
Shailendra Madda
1
<! - mvnrepository.com/artifact/javax.persistence/… -> <dependency> <groupId> javax.persistence </groupId> <artifactId> javax.persistence-api </artifactId> <version> 2.2 </ version > </dependency>
bula
15

Prawdopodobnie masz 2 różne wersje hibernate-jpa-api w ścieżce klas. Aby sprawdzić ten bieg:

mvn dependency:tree >dep.txt

Następnie wyszukaj, czy istnieją hibernate-jpa-2.0-api i hibernate-jpa-2.1-api. I wyklucz nadmiar.

Xelian
źródło
14

Aktualizuję Hibernate JPA do wersji 2.1 i działa.

<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>
    <version>1.0.0.Final</version>
</dependency>
Herbert Rausch
źródło
6

Mogłem rozwiązać ten problem, po prostu zastępując plik jar JPA api, który znajduje się w lokalizacji jboss7 / modules / javax / persistence / api / main, na „hibernate-jpa-2.1-api”. również z aktualizacją module.xml w katalogu.

sinihong
źródło
4

Błąd: java.lang.NoSuchMethodError: javax.persistence.JoinTable.indexes () [Ljavax / persistence / Index;

Jedyną rzeczą, która rozwiązała mój problem, było usunięcie następującej zależności w pom.xml: <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency>

I wymień na:

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

Mam nadzieję, że to komuś pomoże.

Marceloni Lima
źródło
0

napotkałem ten sam problem w mojej aplikacji do rozruchu wiosennego. po ręcznym usunięciu pliku javax.persistance.jar z folderu lib. problem został rozwiązany. w pliku pom.xml pozostałem tylko po zależności

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
Damitha Dayananda
źródło
0

Miałem ten sam problem, naprawiłem go za pomocą org.hibernate.annotations.Tableadnotacji zamiast javax.persistence.Tablew klasie Entity.

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

@Entity
@Table(appliesTo = "my_table")
public class MyTable{
//and rest of the code
Praveen
źródło
0

W Twojej ścieżce klas jest wielu dostawców JPA. Lub przynajmniej w folderze lib serwera aplikacji.

Jeśli używasz Maven Sprawdź zależności za pomocą polecenia wymienionego tutaj https://stackoverflow.com/a/47474708/3333878

Następnie napraw, usuwając / wykluczając niechcianą zależność.

Jeśli masz tylko jedną zależność w ścieżce klas, problem może stanowić moduł ładujący klasy serwera aplikacji.

Ponieważ serwery aplikacji JavaEE, takie jak Websphere, Wildfly, Tomee itp., Mają własne implementacje JPA i innych standardów EE, moduł ładujący klasy może załadować swoją własną implementację zamiast wybierać ze ścieżki klas w pliku WAR / EAR.

Aby tego uniknąć, możesz spróbować wykonać poniższe czynności.

  1. Usuwanie nieprawidłowego pliku jar ze ścieżki biblioteki serwerów aplikacji. Zachowaj ostrożność, ponieważ może to spowodować uszkodzenie innych hostowanych aplikacji.

W Tomee 1.7.5 Plume / Web będzie spakowany eclipselink-2.4.2w libfolderze przy użyciu JPA 2.0, ale musiałem użyć JPA 2.1 z org.hibernate:hibernate-core:5.1.17, więc usunąłem jar eclipselink i dodałem wszystkie powiązane / przechodnie zależności z rdzenia hibernacji.

  1. Dodaj udostępnioną bibliotekę. i ręcznie dodaj pliki JAR do ścieżki serwera aplikacji. Websphere ma tę opcję.

  2. W Websphere można zmienić wykonanie programu ładującego klasy. więc sprawiając, że ścieżka klasy serwera aplikacji będzie ładowana jako ostatnia, tj. jako ostatnia z elementu nadrzędnego, a ścieżka będzie ładowana jako pierwsza. Może to rozwiązać.

Sprawdź, czy Twój serwer aplikacji ma powyższe funkcje, zanim przejdziesz do pierwszego punktu.

Referencje 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

abitcode
źródło