Question

Je suis en train de mettre mes requêtes nommées dans mon orm.xml (mis en META-INF avec persistence.xml) mais mon orm.xml semble être ignoré par mise en veille prolongée / JPA.

Lorsque je tente de créer ma requête avec le nom em.createNamedQuery ( « myQuery »), il revient qu'il ne peut pas trouver cette requête.

J'utilise l'annotation et je voudrais extérioriser mes requêtes nommées dans orm.xml (seulement).

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 orm.xml est ignoré?

Merci

Était-ce utile?

La solution

Ok je l'ai finalement obtenu!

Je gardais mon orm.xml dans le répertoire META-INF. Lorsque je déplace ce fichier dans mon paquet où j'ai mon objet de domaine (comme dans mon exemple: com.mysite), le orm.xml n'est pas ignorée et fonctionnent tous

.

Je dois aussi changer le chemin dans la cartographie fichier (persistence.xml): com / monsite / orm.xml

Autres conseils

Votre orm.xml a une erreur mineure dans ce qui brise la chose. Le fait est que la séquence des déclarations des éléments devraient être conformes aux schémas XML respectif (qui est http://java.sun.com/xml/ns/persistence/orm_1_0.xsd en particulier). C'est facile à vérifier en exécutant le code xml par un validateur qui honore les schémas XML. Voici la version corrigée de votre orm.xml qui doit travailler 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>

Comme dit

  

Lorsque je tente de créer ma requête avec le nom em.createNamedQuery ( "myQuery"), il retourne qu'il ne peut pas trouver cette requête .

Vous avez raison. Mais vous oubliez les éléments suivants

  

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

Alors, vous devez appeler votre namedQuery comme

 em.createNamedQuery("Account.myQuery")

Je suis curieux: Votre classe compte est stocké dans le classpath racine ??? Sinon, vous fixer son paquet manquant. On suppose que la classe de compte est stocké à l'intérieur br.com.hibernate.model.domain.Account. Donc, vous devez déclarer votre entité comme

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

Et vous devez appeler votre namedQuery comme

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

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

.

Cordialement,

« META-INF / orm.xml » est le fichier de mappage par défaut qui sera considéré par un gestionnaire d'entités compatible JPA.

En fait, si votre fichier de mappage est "META-INF / orm.xml", vous ne devez pas définir même que dans votre persistence.xml.

est ce que le manuel de configuration de mise en veille prolongée dit à ce sujet:

  

L'élément de classe spécifie un fichier de mappage XML compatible EJB3 que vous la carte. Le fichier doit être dans le classpath. Selon la spécification EJB3, Hibernate EntityManager essayera de charger le fichier de mappage situé dans le fichier jar à META_INF / orm.xml. Bien sûr, tout fichier de mappage explicite sera chargé aussi. En fait, vous pouvez fournit un fichier XML dans l'élément fichier de mappage par exemple. soit des fichiers HBM ou descripteur de déploiement EJB3.

Référence: configuration Hibernate

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top