Hibernate 3.5.x: NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval
Я пытаюсь перейти на Hibernate 3.5.3-FINAL.
При выполнении моих модульных тестов я получаю следующее исключение:
java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1837)
My classpath содержит следующие JAR:
На спящем уровне:
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
javassist-3.9.0.GA.jar
jta-1.1.jar
slf4j-api-1.5.8.jar
cglib-2.2.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
hibernate3.jar
Другие банки:
blazeds-common-3.2.0.3978.jar
blazeds-core-3.2.0.3978.jar
blazeds-opt-3.2.0.3978.jar
blazeds-proxy-3.2.0.3978.jar
blazeds-remoting-3.2.0.3978.jar
commons-lang-2.3.jar
dbunit-2.4.7.jar
ejb3-persistence.jar // Note, I've tried excluding this, but I get different errors
guava-r05.jar
hsqldb-1.8.0.7.jar
junit-4.1.jar
lambdaj-2.0-with-dependencies.jar
log4j-1.2.14.jar
mockito-all-1.8.0.jar
persistence-api-1.0.jar
spring-security-core-2.0.0.jar
spring.jar
sqljdbc.jar
Я исследовал это, и я найду ответы, которые утверждают, что мой веб-сервер должен быть совместимым с JPA2:
К сожалению, если ваш сервер приложений а не JPA 2, вы, скорее всего, не повезло
Этот проект представляет собой библиотеку, а не проект веб-сервера. (Хотя он в конечном итоге развернут на веб-сервере, я просто запускаю тесты модулей здесь)
Что мне не хватает?
<indulgent_rant>
Как побочный эффект, очень сложно, что каждый раз, когда я обновляю Hibernate, я нахожу, что трачу часы на поиск противоречивых банок для MethodNotFoundException
или ClassNotFoundException
. Должен быть более простой способ?
Я уверен, что с объявлением они объединили модули обратно в один основной проект, чтобы эти конфликты исчезли?
</indulgent_rant>
Ответы
Ответ 1
Как указано Тимо, удалите persistence-api-1.0.jar
.
На всякий случай, вот зависимости, которые я использую:
org.hibernate:hibernate-entitymanager:jar:3.5.3-Final:compile
+- org.hibernate:hibernate-core:jar:3.5.3-Final:compile
| +- antlr:antlr:jar:2.7.6:compile
| +- commons-collections:commons-collections:jar:3.2:compile
| +- dom4j:dom4j:jar:1.6.1:compile
| | \- xml-apis:xml-apis:jar:1.0.b2:compile
| \- javax.transaction:jta:jar:1.1:compile
+- org.hibernate:hibernate-annotations:jar:3.5.3-Final:compile
| \- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile
+- cglib:cglib:jar:2.2:compile
| \- asm:asm:jar:3.1:compile
+- javassist:javassist:jar:3.9.0.GA:compile
\- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.0.Final:compile
Я получаю их из этой единственной декларации в моем pom.xml
:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.3-Final</version>
</dependency>
Это должно как-то ответить на ваш снисходительный разглагольствование (если я перефразирую: используйте Maven - или узнайте, что вы делаете).
Ответ 2
Удалить эти файлы из местоположения проекта
живучесть-апи-1.0.jar
ejb3-persistence.jar
добавить только
javax.persistence-2.0.0.jar
содержит все необходимые поля и атрибуты.
попробуйте, это сработает для вашей проблемы.
Маниш Джейсваль
Ответ 3
Попробуйте заменить persistence-api-1.0.jar на банку JPA 2.0.
Ответ 4
Обнаружено исправление проблемы, по крайней мере, с тем, с чем я работаю: IBM WebSphere 7 и MyEclipse Blue (Spring), или Bling, ver. 10.6. Я создал приложение, которое имеет зависимости от других проектов, один из которых использует Hibernate 3.6.3, требующий JPA 2.0. IBM WS загружает JPA 1.0 для поддержки себя перед JPA 2.0 и решает все ссылки на JPA на ver. 1,0. В случае с IBM WS это приводит к ошибке, описанной выше. Единственное исправление, с которым я столкнулся, теперь включает добавление JPA 2.0 в качестве общей библиотеки, а затем установку сервера для загрузки этой библиотеки перед ее родными классами, аналогично описанному здесь методу:
http://www.mkyong.com/websphere/websphere-7-javaxpersistenceonetomany-orphanremoval-error/
Но наши администраторы серверов не позволят изменять политику сервера на уровне сервера. Поэтому мне все еще нужно найти способ заставить мой проект использовать JPA 2.0, а не 1.0. Я пробовал много чего, но, наконец, пошел за градом Мэри, и это сработало.
Исправление состоит в том, чтобы добавить файл JPA 2.0.jar в ваши .war и .ear проекты, а затем отредактировать строку Class-Path в файле манифеста в ваших проектах .war и .ear, чтобы указать на .jar файлы, Кажется, они должны быть в обоих или подход не будет работать, поэтому JPA 2.0.jar должен быть как в .war, так и в .ear.
В вашем приложении (проект .war) добавьте hibernate-jpa-2.0-api-1.0.0.Final.jar к корню проекта. MyEclipse Blue покажет его как файл в этом месте, а также в списке "Связанные библиотеки" в представлении "Проводник пакетов". Затем откройте файл манифеста в /WebRoot/META -INF/MANIFEST.MF и убедитесь, что строка Class-Path читает:
Class-Path: /hibernate-jpa-2.0-api-1.0.0.Final.jar
В вашем проекте .ear добавьте hibernate-jpa-2.0-api-1.0.0.Final.jar в папку "lib" в корне вашего проекта. Если там нет папки "lib", создайте ее. Затем в файле /META -INF/MANIFEST.MF убедитесь, что строка Class-Path читает:
Class-Path: /lib/hibernate-jpa-2.0-api-1.0.0.Final.jar
Убедитесь, что все файлы сохранены и выполняют чистую сборку. Затем экспортируйте .ear и разверните его как обычно с помощью Integrated Solutions Console. Но есть еще одна вещь, которую вы должны сделать до того, как изменения будут работать; это требует изменения политики загрузки класса для приложения, но не сервера. Вы, скорее всего, получите доступ к своему администратору WAS, чем изменение политики загрузчика классов для всего сервера. Чтобы внести необходимые изменения, после установки файла .ear, следуйте левому кругу кликов на панели навигации "Applications\Application Types\Websphere enterprise applications"
и нажмите на имя своего приложения, затем нажмите "Загрузка классов и update detection"
. Затем выберите "Classes loaded with local class loader first (parent last)"
в "Class loader order"
, затем нажмите Apply
, затем Save
. Теперь вернитесь по следу трека "Applications\Application Types\Websphere enterprise applications"
, запустите или перезапустите приложение. Проверьте свое приложение и, надеюсь, вам будет хорошо идти.
Заключительное примечание: Во время повторного развертывания вашего .ear файла вам нужно будет установить параметр classloader, который я только что обсуждал. Предпочтение не сохраняется между развертываниями.
Ответ 5
добавление javax.persistence-2.0.0.jar должно работать нормально...
Ответ 6
Настройка политики загрузчика класса сервера для родительского последнего приведет к устранению этой проблемы, пока вы гарантируете, что файл hibernate-jpa-2.0-api включен в EAR. Если это возможно в вашей среде, это намного проще.
Протестировано на WebSphere 7.