Domanda

Sto cercando di mettere le mie query nominate nel mio Orm.xml (messo in meta-Inf con persistenza.xml) ma il mio Orm.xml sembra essere ignorato da Hibernate/JPA.

Quando provo a creare la mia query denominata con em.CreateNedQuery ("MyQuery"), restituisce che non riesce a trovare questa query.

Uso l'annotazione e vorrei esternalizzare le mie domande nominate in Orm.xml (solo quello).

Ecco la mia persistenza.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>

Ecco il mio 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>

Cosa sto facendo di sbagliato? Perché il mio Orm.xml è ignorato?

Grazie

È stato utile?

Soluzione

Ok finalmente l'ho capito!

Stavo salvando il mio ORM.XML nella directory Meta-INF. Quando sposta questo file nel mio pacchetto in cui ho il mio oggetto di dominio (come nel mio esempio: com.mysite), Orm.xml non viene ignorato e tutto eseguito.

Devo anche cambiare il percorso nel file di mappatura (persistenza.xml): com/mysite/orm.xml

Altri suggerimenti

Il tuo ORM.XML ha un errore minore che rompe tutto. Il punto è che la sequenza delle dichiarazioni degli elementi dovrebbe essere conforme al rispettivo schema XML (che è http://java.sun.com/xml/ns/persistence/orm_1_0.xsd in particolare). È facile da verificare eseguendo il codice XML tramite un validatore che onora gli schemi XML. Di seguito è riportata la versione corretta del tuo ORM.XML che deve funzionare come un fascino.

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

Come detto

Quando provo a creare la mia query denominata con em.createNedQuery ("MyQuery"), Restituisce che non è possibile trovare questa domanda.

Hai ragione. Ma dimentichi quanto segue

Se si posiziona una definizione di query denominata all'interno di un elemento, anziché la radice, È prefisso con il nome della classe entità

Quindi devi chiamare il tuo nome intitolato come

 em.createNamedQuery("Account.myQuery")

Sono curioso: la tua classe di account è archiviata nella classe di root ??? In caso contrario, hai risolto il pacchetto mancante. Supponiamo che la classe dell'account sia archiviata all'interno di br.com.hibernata.model.domain.account. Quindi dovresti dichiarare la tua entità come

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

E devi chiamare il tuo nome intitolato come

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

Solo un aderente: quando si utilizza Hibernate come fornitore di persistenza, non è necessario definire la tua classe di entità nel file Persistence.xml.

Saluti,

"Meta-Inf/Orm.xml" è il file di mappatura predefinito che sarà considerato da qualsiasi gestore di entità conforme a JPA.

In effetti, se il tuo file di mappatura è "Meta-Inf/Orm.xml", non è necessario definirlo nemmeno nella tua persistenza.xml.

Questo è ciò che dice il manuale di configurazione di Hibernate al riguardo:

L'elemento di classe specifica un file di mappa XML conforme all'EJB3 che mappurerai. Il file deve essere nel percorso di classe. Secondo la specifica EJB3, Hibernate EntityManager proverà a caricare il file di mappatura situato nel file JAR su Meta_INF/ORM.XML. Naturalmente anche qualsiasi file di mappatura esplicito verrà caricato. È un dato di fatto, è possibile fornire qualsiasi file XML nell'elemento del file di mappatura IE. o Descrittore di distribuzione HBM o EJB3.

Riferimento: configurazione in letargo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top