NamedQuery: IllegalArgumentException (запрос не найден) после экстернализации объектов - PullRequest
12 голосов
/ 30 мая 2011

Я успешно использовал javax.persistence.NamedQuery в сочетании с JPA2.Именованные запросы определяются в верхней части файлов классов сущностей и используются из EJB-компонентов без сохранения состояния (фасад фасада).

Теперь мне пришлось извлечь файлы классов сущностей в отдельный файл Jar (поэтому мы можем использоватьих из проекта Google Web Toolkit).Очевидно, я до сих пор вкручиваю банку, но теперь фасадный компонент больше не находит запрос:

java.lang.IllegalArgumentException: NamedQuery of name: Store.findByExternalId not found.
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getDatabaseQueryInternal(EJBQueryImpl.java:576)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1004)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createNamedQuery(EntityManagerWrapper.java:533)
    at com.skalio.bonusapp.server.StoreFacade.getByExternalId(StoreFacade.java:43)
    ...

В чем здесь проблема?Могу ли я не определять NamedQueries во внешнем Jar-файле?

Я только что нашел эту ссылку , предлагающую поместить NamedQueries в файлы XML, а не как аннотации в файлах сущностей.Это может быть идея, чтобы решить мою проблему, но не отвечает на мой вопрос ...;)

1 Ответ

23 голосов
/ 30 мая 2011

Решение состоит в том, чтобы указать классы, содержащие сущности JPA, в файле persistence.xml:

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="bonusAppServerPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/someDB</jta-data-source>
        <class>com.skalio.bonusapp.core.Store</class>
    </persistence-unit>
</persistence>

Справочная информация заключается в том, что JPA необходимо указать, где искать аннотации. Другой вариант - использовать узел <jar-file></jar-file>.

...