определить именованный запрос в orm.xml с помощью jpa и hibernate - PullRequest
19 голосов
/ 03 марта 2010

Я пытаюсь поместить свои именованные запросы в мой файл orm.xml (помещенный в META-INF с persistence.xml), но мой файл orm.xml, похоже, игнорируется hibernate / jpa.

Когда я пытаюсь создать свой именованный запрос с помощью em.createNamedQuery («myQuery»), он возвращает, что не может найти этот запрос.

Я использую аннотацию, и я хотел бы вывести свои именованные запросы в orm.xml (только это).

Вот мой файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1_0.xsd" version="1.0">

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
    <mapping-file>META-INF/orm.xml</mapping-file>

    <class>com.mysite.Account</class>

    <properties>
        <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" />
        <property name="hibernate.cache.use_query_cache" value="true" />
        <property name="hibernate.cache.use_second_level_cache" value="true" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="use_sql_comments" value="false" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MYSQLDialect" />
        <property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.max_size" value="20" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.idle_test_period" value="3000" />

        <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider" />
    </properties>

</persistence-unit>

</persistence>

вот мой orm.xml

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">

<package>com.mysite</package>

<entity class="Account">
    <sql-result-set-mapping name="nicknames">
        <column-result name="nickname" />
    </sql-result-set-mapping>
    <table name="Account" />
    <named-native-query name="myQuery" result-set-mapping="nicknames">
        <query><![CDATA[select a.nickname from Account a]]>
    </query>
    </named-native-query>
</entity>
</entity-mappings>

Что я делаю не так? Почему мой orm.xml игнорируется?

спасибо

Ответы [ 4 ]

10 голосов
/ 04 марта 2010

Хорошо, я наконец-то понял!

Я сохранял свой orm.xml в каталоге META-INF. Когда я перемещаю этот файл в свой пакет, где у меня есть мой доменный объект (как в моем примере: com.mysite), orm.xml не игнорируется и все запускается.

Мне также нужно изменить путь в файле отображения (persistence.xml): com / mysite / orm.xml

4 голосов
/ 27 октября 2011

В вашем файле orm.xml есть небольшая ошибка, которая нарушает все. Дело в том, что последовательность объявлений элементов должна соответствовать соответствующей XML-схеме (в частности, http://java.sun.com/xml/ns/persistence/orm_1_0.xsd). Это легко проверить, выполнив код XML через валидатор, который учитывает схемы XML. Ниже приведена исправленная версия вашего orm.xml, которая должна работать как шарм.

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="
                     http://java.sun.com/xml/ns/persistence/orm
                     http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                 version="1.0">

    <package>com.mysite</package>

    <entity class="Account">
        <table name="Account" />
        <named-native-query name="myQuery" result-set-mapping="nicknames">
            <query><![CDATA[
            select a.nickname from Account a
            ]]></query>
        </named-native-query>
        <sql-result-set-mapping name="nicknames">
            <column-result name="nickname" />
        </sql-result-set-mapping>
    </entity>
</entity-mappings>
2 голосов
/ 04 марта 2010

Как сказал

Когда я пытаюсь создать свой именованный запрос с помощью em.createNamedQuery ("myQuery"), возвращает, что не может найти этот запрос .

Вы правы. Но вы забыли следующее

Если вы поместите определение именованного запроса в элемент, а не в корень, то будет иметь префикс с именем класса сущности

Так что вам нужно назвать ваш namedQuery как

 em.createNamedQuery("Account.myQuery")

Мне любопытно: ваш класс Account хранится в корневом пути к классам ??? Если нет, то вы должны исправить пропавший пакет. Предположим, что класс Account хранится внутри br.com.hibernate.model.domain.Account. Поэтому вы должны объявить свою сущность как

<entity class="br.com.hibernate.model.domain.Account" instead

И вам нужно назвать ваш namedQuery как

em.createNamedQuery("br.com.hibernate.model.domain.Account.myQuery") instead

Просто совет: когда вы используете Hibernate в качестве поставщика сохраняемости, вам не нужно определять свой класс Entity в файле persistence.xml.

С уважением,

0 голосов
/ 28 марта 2011

"META-INF / orm.xml" - это файл сопоставления по умолчанию, который будет просматриваться любым менеджером сущностей, совместимым с JPA.

На самом деле, если ваш файл сопоставления - «META-INF / orm.xml», вам даже не нужно определять это в своем файле persistence.xml.

Вот что говорится в руководстве по конфигурации hibernate:

Элемент class определяет EJB3-совместимый файл сопоставления XML, который вы будете отображать. Файл должен быть в пути к классам. Согласно спецификации EJB3, Hibernate EntityManager попытается загрузить файл сопоставления, расположенный в файле jar, в META_INF / orm.xml. Конечно, любой явный файл сопоставления также будет загружен. На самом деле, вы можете предоставить любой файл XML в элементе файла отображения, т.е. либо hbm-файлы, либо дескриптор развертывания EJB3.

Ссылка: конфигурация Hibernate

...