Я перевожу проект EJB 2.0 из Websphere в Glassfish.Большинство запросов находятся в файле ejb-jar.xml в EJB QL, который почти, но не совсем, полностью отличается от SQL.
Однако существует проблема с некоторыми запросами, которые содержатUPPER () и LOWER (), такие как:
<query>
<description></description>
<query-method>
<method-name>findByPersonUserId</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-ql>select object(o) from Person o where o.personUserId = lower(?1)</ejb-ql>
</query>
Исследования показали, что LOWER () и UPPER () не были указаны в спецификации EJB 2.0.Websphere пошел дальше и использовал расширение EJB QL, которое включало LOWER () и UPPER (), поэтому все это работало нормально, а Glassfish - нет, и это означает, что при запуске я получаю следующую ошибку:
Вызвано: java.lang.RuntimeException: JDO74025: JDOCodeGenerator: Обнаружено исключение, проверяющее bean-компонент CMP «Person» в модуле «MyPackage» приложения «MyPackageEJB»: JDO75006: недопустимый запрос EJBQL
Bean: Person
Метод mypackage.entity.PersonLocal findByPersonUserId (java.lang.String)
EJBQL: выбрать объект (o) из Person o, где o.personUserId = нижний (? 1)
Ошибка: столбец (60): JDO75202: ошибка синтаксиса: неожиданный токен'('.
Однако дальнейшие исследования показали, что в EJB 3.0 есть LOWER () и UPPER () как часть стандарта, и поэтому они должны работать.Однако я не могу этого сделать, независимо от того, что я делаю, я всегда получаю одну и ту же ошибку.
Это делается в Eclipse.
То, что я сделал до сих пор:
1. Я сделализменения в тексте запроса и видел обновленную версию в журналах Glassfish.Итак, я знаю, что EAR генерируется и развертывается правильно - не нужно постоянно пытаться развернуть один и тот же сломанный EAR.
2. Я обновил объявление ejb-jar.xml с 2.0 до 3.1:
Старый: <ejb-jar id="ejb-jar_ID" version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
Новый: <ejb-jar id="ejb-jar_ID" version="3.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">
В Eclipse, в свойствах проекта -> Фасеты проекта, я обновил версию модуля EJB с 2.1 до 3.2.Я также включил фасет JPA (не установлен ранее, так как, я думаю, Websphere не нуждался в этом?) И установил его на 2.1. В свойствах проекта -> JPA я изменил платформу с Generic 2.1 на EclipseLink 2.5.x [1] и изменил реализацию с системной библиотеки Glassfish на пользовательскую библиотеку EclipseLink 2.5.2. Я заметил, что, хотя включение фасета JPA создало файл persistence.xml, которого раньше не существовало, это был всего лишь пустой элемент единицы постоянства.Изменения на странице свойств JPA никогда не вносили никаких изменений в этот файл, даже когда я менял информацию о поставщике или подключении к базе данных.Добавление в
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
не вызвало каких-либо изменений в поведении.
Но ошибка не меняется.Похоже, что ни одна из настроек на самом деле не повлияла на то, какой поставщик используется для проверки запросов EJB QL.
Итак, вопросы.
- Прав ли япредполагая, что LOWER () / UPPER () должен работать в EJB 3.0 (альтернативно, есть ли какой-нибудь провайдер EJB 2, который я мог бы использовать на Glassfish, который бы его поддерживал)?
- Прав ли я, предполагая, что файл ejb-jar.xml не должен требовать изменения, кроме изменения объявления версии вверху?
- Я что-то упускаю из-за того, что говорю Glassfish о том, на каком уровне EJB должен проверяться EAR или какой провайдер JPA он должен использовать?
[1]Я вижу, что есть версия 2.7 для EclipseLink.Я не знаю, почему Eclipse не предлагает его мне в качестве опции (используя Java 8, работает Eclipse Oxygen), но если это не станет ключом к решению моей проблемы, мне на самом деле все равно.