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]
java
playframework-2.0
hibernate-4.x
musubi
źródło
źródło
Odpowiedzi:
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.źródło
<groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId>
więcejhibernate-jpa-2.0-api
Hibernate4.2.8.Final
działa4.3.0.Final
również zgłoszenie błędu.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ć?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
źródło
indexes()
odwołanie typuorg.hibernate.annotations.Table
.Prawdopodobnie masz 2 różne wersje hibernate-jpa-api w ścieżce klas. Aby sprawdzić ten bieg:
Następnie wyszukaj, czy istnieją hibernate-jpa-2.0-api i hibernate-jpa-2.1-api. I wyklucz nadmiar.
źródło
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>
źródło
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.
źródło
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.
źródło
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
źródło
Miałem ten sam problem, naprawiłem go za pomocą
org.hibernate.annotations.Table
adnotacji zamiastjavax.persistence.Table
w klasie Entity.import javax.persistence.Entity; import org.hibernate.annotations.Table; @Entity @Table(appliesTo = "my_table") public class MyTable{ //and rest of the code
źródło
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.
W Tomee 1.7.5 Plume / Web będzie spakowany
eclipselink-2.4.2
wlib
folderze przy użyciu JPA 2.0, ale musiałem użyć JPA 2.1 zorg.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.Dodaj udostępnioną bibliotekę. i ręcznie dodaj pliki JAR do ścieżki serwera aplikacji. Websphere ma tę opcję.
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
źródło