JBoss / Hibernate IllegalArgumentException: именованный запрос не найден - PullRequest
1 голос
/ 09 июня 2011

Я новичок в Java EE и у меня возникли проблемы с использованием именованных запросов. Мы используем JBoss 6 и Hibernate 3.6 (JPA 2.0). Сущность настраивается с помощью аннотаций, а не в файле persistence.xml:

@Entity
@NamedQueries({
    @NamedQuery(name = "Node.findRootNodes", query = "SELECT n FROM Node n WHERE n.parent IS NULL OR n.parent = 0"),
    ...
})
public class Node implements Serializable { ... }

При развертывании jar-файла, содержащего сущность, JBoss-log сообщает нам, что именованный запрос связан:

[org.hibernate.cfg.annotations.QueryBinder] Binding Named query: Node.findRootNodes => SELECT n FROM Node n WHERE n.parent IS NULL OR n.parent = 0

К сожалению, при использовании именованного запроса мы всегда сталкиваемся с IllegalArgumentException:

[com.NodeTest] null: javax.ejb.EJBException: java.lang.IllegalArgumentException: Named query not found: Node.findRootNodes

Компонент без сохранения состояния, использующий именованный запрос, находится в том же банке, что и Node-Entity. Приложение, вызывающее компонент без сохранения состояния, находится в другом развернутом файле войны.

Кто-нибудь имеет представление, что я делаю не так? Спасибо за ваш ответ.

Вот файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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="testPU" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider> 
        <jta-data-source>java:/main</jta-data-source>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>
        </properties>
    </persistence-unit>
</persistence>

Ответы [ 2 ]

4 голосов
/ 09 июня 2011

Что проверить:

  • если ваш EntityManager был создан EntityManagerFactory, представляющим правильную единицу персистентности
  • действительно ли ваш Entity обработан данным блоком персистентности. Попробуйте загрузить объект с указанным идентификатором.
  • найдены ли другие именованные запросы в других сущностях

Обновление 1: Кажется, ваша сущность не загружена модулем персистентности. Проверьте persistence.xml на <exclude-unlisted-classes> и удалите его. Hibernate должен поддерживать автоматическое обнаружение объектов, но только для проверки - укажите свой класс в persistence.xml

Обновление 2: Убедитесь, что ваша аннотация @Entity на самом деле javax.persistence.Entity, а не org.hibernate....

1 голос
/ 10 июня 2011

Я мог бы решить эту проблему, переместив persistence.xml внутрь war, который содержит приложение, вместо jar, который содержит сущности и бин. Кроме того, мне пришлось добавить следующую строку в мой persistence.xml:

<jar-file>Entities.jar</jar-file>

Но теперь мне нужно поместить файл persistence.xml в любое приложение, использующее мой Entities.jar.

...