У меня есть 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]
Ответы:
Я столкнулся с той же проблемой. Вопрос в том, что артефакт 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
. В предыдущих версиях были некоторые отличия в файлах сборки.источник
<groupId>org.hibernate.java-persistence</groupId> <artifactId>jpa-api</artifactId>
большеhibernate-jpa-2.0-api
Hibernate также выдает ошибку.4.2.8.Final
4.3.0.Final
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" )
все еще выкидывает NoSuchMethodExceptionNoSuchMethodError:javax.persistence.JoinTable.indexes()
Кто-нибудь знает, как решить?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
.У вас, вероятно, есть 2 разные версии hibernate-jpa-api в пути к классам. Чтобы проверить этот запуск:
Затем найдите, есть ли hibernate-jpa-2.0-api и hibernate-jpa-2.1-api. И исключить лишнее.
источник
Я обновляю свой 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>
источник
Я мог бы решить проблему, просто заменив jar-файл JPA api, который находится в jboss7 / modules / javax / persistence / api / main, на hibernate-jpa-2.1-api. также с обновлением module.xml в каталоге.
источник
Ошибка: 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>
Надеюсь, это кому-то поможет.
источник
У меня возникла такая же проблема в моем приложении весенней загрузки. после удаления вручную файла javax.persistance.jar из папки lib. проблема была исправлена. в файле pom.xml я остался только после зависимости
источник
У меня была такая же проблема, я исправил ее, используя
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
источник
В вашем пути к классам есть несколько поставщиков JPA. Или, по крайней мере, в папке lib вашего сервера приложений.
Если вы используете Maven Check for dependencies, используя команду, указанную здесь https://stackoverflow.com/a/47474708/3333878
Затем исправьте, удалив / исключив нежелательную зависимость.
Если у вас только одна зависимость в пути к классам, проблема может быть в загрузчике классов сервера приложений.
Поскольку серверы приложений JavaEE, такие как Websphere, Wildfly, Tomee и т. Д., Имеют свои собственные реализации JPA и других стандартов EE, загрузчик классов может загружать свою собственную реализацию вместо выбора из пути к классам в файле WAR / EAR.
Чтобы избежать этого, вы можете попробовать следующие шаги.
В 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 и добавил все связанные / транзитивные зависимости из ядра спящего режима.Добавить общую библиотеку. и вручную добавить jar-файлы на путь к серверу приложений. У Websphere есть такая возможность.
В 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
источник