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.