web-dev-qa-db-fra.com

définir une requête nommée dans orm.xml avec jpa et hibernate

J'essaie de placer mes requêtes nommées dans mon fichier orm.xml (dans META-INF avec persistence.xml), mais mon fichier orm.xml semble être ignoré par hibernate/jpa. 

Lorsque j'essaie de créer ma requête nommée avec em.createNamedQuery ("myQuery"), il renvoie qu'il ne peut pas trouver cette requête.

J'utilise des annotations et j'aimerais externaliser mes requêtes nommées dans orm.xml (uniquement).

Voici mon 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>

voici mon 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>

Qu'est-ce que je fais mal? Pourquoi mon fichier orm.xml est-il ignoré?

merci

19
Jerome Cance

Ok je l'ai finalement eu!

Je sauvegardais mon fichier orm.xml dans le répertoire META-INF. Lorsque je déplace ce fichier vers mon package contenant mon objet de domaine (comme dans mon exemple: com.mysite), le fichier orm.xml n'est pas ignoré et est exécuté.

J'ai également besoin de changer le chemin d'accès dans le fichier de mappage (persistence.xml): com/mysite/orm.xml

10
Jerome Cance

Votre orm.xml a une erreur mineure qui casse tout. Le fait est que la séquence des déclarations d'éléments doit être conforme au schéma XML respectif (qui est http://Java.Sun.com/xml/ns/persistence/orm_1_0.xsd en particulier). Cela est facile à vérifier en exécutant le code XML via un validateur qui respecte les schémas XML. Vous trouverez ci-dessous la version corrigée de votre fichier orm.xml qui doit fonctionner comme un charme.

<?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>
4
Dmitri

Comme dit

Lorsque j'essaie de créer ma requête nommée avec em.createNamedQuery ("myQuery"), il renvoie qu'il ne peut pas trouver cette requête .

Tu as raison. Mais vous oubliez ce qui suit

Si vous placez une définition de requête nommée dans un élément, au lieu de la racine, elle est préfixée du nom de la classe d'entité

Donc, vous devez appeler votre namedQuery en tant que

 em.createNamedQuery("Account.myQuery")

Je suis curieux: votre classe Account est-elle stockée dans le chemin de classe racine ??? Sinon, vous devez réparer le paquet manquant. Supposons que la classe Account soit stockée dans br.com.hibernate.model.domain.Account. Donc, vous devriez déclarer votre entité comme

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

Et vous devez appeler votre namedQuery en tant que

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

Juste un conseil: lorsque vous utilisez Hibernate en tant que fournisseur de persistance, vous n'avez pas besoin de définir votre classe Entity dans le fichier persistence.xml.

cordialement,

2
Arthur Ronald

"META-INF/orm.xml" est le fichier de mappage par défaut qui sera considéré par tout gestionnaire d'entités conforme à JPA.

En fait, si votre fichier de mappage est "META-INF/orm.xml", vous n'avez même pas besoin de définir cela dans votre persistence.xml.

Voici ce que dit le manuel de configuration d'Hibernate à ce sujet:

L'élément class spécifie un fichier de mappage XML conforme à EJB3 que vous allez mapper. Le fichier doit être dans le classpath. Conformément à la spécification EJB3, Hibernate EntityManager essaiera de charger le fichier de mappage situé dans le fichier jar à l'adresse META_INF/orm.xml. Bien entendu, tout fichier de mappage explicite sera également chargé. En fait, vous pouvez fournir n’importe quel fichier XML dans l’élément de fichier de mappage, c’est-à-dire. fichiers hbm ou descripteur de déploiement EJB3.

Référence: Configuration Hibernate

0
James Selvakumar