utilizar usar tutorial query example como java hibernate orm jpa named-query

java - usar - defina la consulta nombrada en orm.xml con jpa e hibernate



jpa query (4)

"META-INF / orm.xml" es el archivo de mapeo predeterminado que será examinado por cualquier administrador de entidades compatible con JPA.

De hecho, si su archivo de mapeo es "META-INF / orm.xml", ni siquiera necesita definirlo en su persistence.xml.

Esto es lo que dice el manual de configuración de hibernación sobre esto:

El elemento de clase especifica un archivo de asignación XML compatible con EJB3 que se asignará. El archivo tiene que estar en el classpath. De acuerdo con la especificación EJB3, Hibernate EntityManager intentará cargar el archivo de mapeo ubicado en el archivo jar en META_INF / orm.xml. Por supuesto, también se cargará cualquier archivo de mapeo explícito. De hecho, puede proporcionar cualquier archivo XML en el elemento del archivo de mapeo, es decir. ya sea archivos hbm o descriptor de despliegue EJB3.

Referencia: configuración de hibernación.

Estoy tratando de poner mis consultas con nombre en mi orm.xml (poner en META-INF con persistence.xml) pero parece que hibernate / jpa ignora mi orm.xml.

Cuando intento crear mi consulta nombrada con em.createNamedQuery ("myQuery"), devuelve que no puede encontrar esta consulta.

Utilizo la anotación y me gustaría externalizar mis consultas nombradas en orm.xml (solo eso).

Aquí está mi persistencia.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>

aqui esta mi 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é estoy haciendo mal? ¿Por qué mi orm.xml es ignorado?

Gracias


Como dijo

Cuando intento crear mi consulta nombrada con em.createNamedQuery ("myQuery"), devuelve que no puede encontrar esta consulta .

Tienes razón. Pero te olvidas de lo siguiente

Si coloca una definición de consulta nombrada dentro de un elemento, en lugar de la raíz, se prefijará con el nombre de la clase de entidad

Así que necesitas llamar a tu namedQuery como

em.createNamedQuery("Account.myQuery")

Tengo curiosidad: ¿Su clase de cuenta está almacenada en la ruta de clase raíz? Si no, has arreglado su paquete faltante. Supongamos que la clase de cuenta se almacena dentro de br.com.hibernate.model.domain.Account. Así que deberías declarar tu entidad como

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

Y necesitas llamar a tu namedQuery como

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

Solo un anuncio: cuando utiliza Hibernate como su proveedor de persistencia, no necesita definir su clase de entidad en el archivo persistence.xml.

Saludos,


Ok, finalmente lo tengo!

Estaba guardando mi orm.xml en el directorio META-INF. Cuando muevo este archivo a mi paquete donde tengo mi objeto de dominio (como en mi ejemplo: com.mysite), el orm.xml no se ignora y todo se ejecuta.

También necesito cambiar la ruta en el archivo de mapeo (persistence.xml): com / mysite / orm.xml


Tu orm.xml tiene un pequeño error que rompe todo. El punto es que las declaraciones de la secuencia de elementos deben cumplir con el esquema XML respectivo (que es http://java.sun.com/xml/ns/persistence/orm_1_0.xsd en particular). Es fácil de verificar ejecutando el código xml a través de un validador que respeta los esquemas xml. A continuación se muestra la versión corregida de su orm.xml que debe funcionar como un encanto.

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