Как использовать javax/persistence/spi/PersistenceUnitInfo.getValidationMode() с WAS 6.1

Я использую JPA 2.0 с Spring и гибернацией в своем проекте.

Однако среда выполнения — WAS 6.1.

Сборка проходит нормально.

Однако во время развертывания приложения я получаю следующую ошибку:

com.ibm.ws.exception.RuntimeError: java.lang.RuntimeException: java.lang.NoSuchMethodError: javax/persistence/spi/PersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;

При поиске класса PersistenceUnitInfo с помощью ctrl + shift + T я обнаружил, что он находится в следующих банках:

\IBM\SDP\runtimes\base_v61\lib\j2ee.jar

и

\WEB-INF\lib\hibernate-jpa-2.0-api-1.0.1.Final

Я извлек вышеуказанный класс из обоих JARS и декомпилировал их, используя JAD для сравнения.

Я обнаружил, что метод getValidationMode() отсутствует в j2ee.jar, но присутствует в банке hibernate-jpa.

Это причина ошибки, которую я получаю??? Как это решить?? Как я могу сказать веб-сфере искать класс в банке гибернации, а не в библиотеке времени выполнения сервера ???


person Vicky    schedule 17.10.2011    source источник


Ответы (1)


Вы не можете использовать JPA 2.0 с Websphere 6.1, что бы вы ни делали. Как вы заметили, он довольно глубоко встроен во внутренности WAS. У вас есть два варианта:

  1. Перейдите на WAS 7.0 с соответствующим пакетом функций (дополнительная информация в моем другом ответе).
  2. Понизьте Hibernate до версии 3.3.2 GA с помощью JPA 1.0.
person MaDa    schedule 17.10.2011
comment
Чтобы было ясно, вы не можете использовать JPA, управляемый контейнером, с 6.1 (persistence-context/unit-ref и @PersistenceContext/UnitRef). Если вы используете общую библиотеку для переопределения поддержки JPA, вы все равно можете использовать JPA, управляемую приложением. Конечно, вы теряете много преимуществ таким образом... - person Brett Kail; 17.10.2011
comment
@bkail Но вы все еще имеете в виду JPA 1.0, верно? Я не знаком с версией WAS 6.1, я просто экстраполировал, основываясь на своем опыте работы с 7.0. Так что с 6.1 еще сложнее... - person MaDa; 17.10.2011
comment
Нет, если вы переопределяете API-интерфейсы JPA (используя какой-либо родитель-последний CL), вы можете использовать все, что хотите (включая JPA 2.0), если вы не ожидаете, что контейнер будет интегрироваться с тем, что вы предоставляете. - person Brett Kail; 18.10.2011
comment
@bkail Я не понимаю, что вы имеете в виду, говоря, что контейнер не интегрируется: вы можете носить его в ухе, но не можете ожидать, что он сработает? В чем смысл? И я думаю, вы ошибаетесь, предполагая, что можно переопределить встроенный API JPA, потому что вы просто не можете - вам придется самостоятельно вырезать его из j2ee.jar. Удачи с этим, это похоже на случайное удаление .dll из c:\Windows\system. - person MaDa; 18.10.2011
comment
Вы можете переопределить API-интерфейсы JPA в своем приложении точно так же, как вы можете переопределить API-интерфейсы XML. Вы включаете JAR API JPA в свой путь к классу, а затем помечаете загрузчик класса как родителя последним (загрузчик класса будет игнорировать j2ee.jar, поэтому нет причин изменять этот файл). Однако контейнер JPA предполагает, что вы этого не сделаете, поэтому вы не сможете использовать JPA, управляемую контейнером (persistence-context/unit-ref и @PersistenceContext/UnitRef). Я признаю, что это не лучший вариант, но если вы застряли на 6.1, это ваш единственный вариант. - person Brett Kail; 18.10.2011
comment
@bkail Спасибо за объяснение. Итак, вопрос, на который мне теперь нужно найти ответ, звучит так: «Как переопределить API-интерфейсы Java WAS 6.1 с помощью API-интерфейсов приложений?» :) :) учиться с открытием новых вещей - это здорово... ура!! - person Vicky; 20.10.2011
comment
@bkail Мы можем спорить так вечно. Поделитесь своим опытом, когда у вас получится, я буду рад узнать, как это сделать. - person MaDa; 20.10.2011
comment
@NikunjChauhan Измените режим загрузчика классов, содержащего файлы JAR, чтобы использовать родительский элемент в последнюю очередь (или классы, загруженные с помощью загрузчика классов приложений в первую очередь). Например, если JAR находится в WAR, то этот параметр следует применить к модулю WAR. Если JAR находится непосредственно в EAR, то настройка должна применяться к приложению. Если JAR находится в общей библиотеке для загрузчика классов сервера, то этот параметр следует применить к этому загрузчику классов сервера. - person Brett Kail; 20.10.2011