Hibernate 3.5.x: NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval - PullRequest
12 голосов
/ 06 июля 2010

Я пытаюсь перейти на Hibernate 3.5.3-FINAL.

При выполнении моих модульных тестов я теперь получаю следующее исключение:

java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z   
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1837)

Мой 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>

Ответы [ 6 ]

20 голосов
/ 06 июля 2010

Как указал Тимо, удалите 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 - или знай, что ты делаешь).

10 голосов
/ 03 июня 2011

Удалите эти файлы из папки lib проекта живучесть-апи-1.0.jar ejb3-persistence.jar

добавить только javax.persistence-2.0.0.jar

содержит все обязательные поля и атрибуты.

попробуйте, это сработает для вашей проблемы.

Маниш Джайсвал

3 голосов
/ 25 сентября 2012

Обнаружено исправление проблемы, по крайней мере, с тем, с чем я работаю: 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 до версии. 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 отобразит его в виде файла в этом месте, а также в списке «Библиотеки ссылок» в представлении Package Explorer. Затем откройте файл манифеста в /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-файл, вам нужно будет установить опцию загрузчика классов, которую я только что обсуждал. Предпочтение не сохраняется между развертываниями.

3 голосов
/ 06 июля 2010

Попробуйте заменить файл persistence-api-1.0.jar на JPA 2.0.

1 голос
/ 29 ноября 2011

добавление javax.persistence-2.0.0.jar должно работать нормально ...

0 голосов
/ 17 сентября 2013

Установка политики загрузчика классов вашего сервера на родительский последний решит эту проблему до тех пор, пока вы убедитесь, что файл jar hibernate-jpa-2.0-api включен в EAR. Если это возможно в вашей среде, это гораздо более простое решение.

Протестировано в WebSphere 7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...