JBoss/Hibernate IllegalArgumentException: именованный запрос не найден

Я новичок в 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-лог сообщает нам, что именованный запрос привязан:

[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

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

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

Вот файл 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>

person Flurin Juvalta    schedule 09.06.2011    source источник


Ответы (2)


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

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

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

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

person Bozho    schedule 09.06.2011
comment
EntityManager внедряется с помощью @PersistencUnit. В persistence.xml определена только одна единица сохраняемости. Загрузка объекта с заданным идентификатором завершается с ошибкой IllegalArgumentException: Unknown entity. Хм... так сущность на самом деле не обрабатывается блоком постоянства? - person Flurin Juvalta; 09.06.2011
comment
да. вам нужно ввести его с помощью @PersistenceContext кстати. в остальном - проверяйте обновлено. - person Bozho; 09.06.2011
comment
Упс, извините, конечно, я ввел @PersistenceContext, я попробовал ваш совет, чтобы перечислить классы сущностей в файле persistence.xml, но все же Unknown entity. Кстати. Я обновил сообщение своим файлом persistence.xml. - person Flurin Juvalta; 09.06.2011
comment
ну, тогда вы не получаете правильный контекст сохранения... но я не знаю, почему. - person Bozho; 09.06.2011
comment
Может ли возникнуть проблема с вызовом bean-компонента без сохранения состояния, когда EntityManager вводится из приложения (сервлета), развернутого в другом файле войны? Файл persistence.xml помещается в банку, содержащую bean-компонент без сохранения состояния и сущности. - person Flurin Juvalta; 09.06.2011
comment
вы проверили аннотацию @Entity? - person Bozho; 09.06.2011
comment
Да, это javax.persistence.Entity - person Flurin Juvalta; 09.06.2011

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

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

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

person Flurin Juvalta    schedule 10.06.2011