2009-03-02 13 views

Respuesta

9

Se puede retener las consultas en package-info.java clase, en, por ejemplo, la raíz paquete de sus objetos de dominio. Sin embargo, debe utilizar las propias anotaciones de Hibernate @NamedQueries y @NamedQuery, en lugar de las de javax.persistence.

Ejemplo package-info.java archivo:

@org.hibernate.annotations.NamedQueries({ 
    @org.hibernate.annotations.NamedQuery(
     name = "foo.findAllUsers", 
     query="from Users") 
}) 

package com.foo.domain; 

Entonces, hay que añadir el paquete a su AnnotationConfiguration. Yo uso la primavera, por lo que no es una cuestión de establecer annonatedPackages propiedad:

<bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
<property name="annotatedClasses"> 
     <list> 
     ... 
     </list> 
</property> 
<property name="annotatedPackages"> 
    <list> 
     <value>com.foo.domain</value> 
    </list> 
</property> 

También se puede poner tipo de filtro y las definiciones en el mismo archivo también.

+0

Desde mi punto de vista esto no es consultar externalización - es compilado en clase y para mí tener docenas de consultas en la clase de entidad o incluso más consultas en la clase de paquete de información-Voy a elegir entidad. mi humilde opinión, esto no es la respuesta correcta para esta pregunta, no tengo ni idea de por qué se acepta -> -1 – Betlista

+0

1 Para mí está bien. Muestra cómo externalizar usando Java Config y XML también. Lea la pregunta antes de la votación negativa, indica claramente que no quiere tener las NamedQueries dentro de la clase. – Augusto

3

No creo que esto es posible como atributo de anotación/valores de la propiedad debe estar disponible en tiempo de compilación. Por lo tanto, las cadenas no se pueden externalizar a un archivo que necesita ser leído por algún tipo de proceso.

He intentado encontrar si había algo que package-info.java podría ser capaz de proporcionar, pero no pudo encontrar nada.

Una estrategia alternativa para la organización podría ser almacenar las consultas como constantes en una clase.

En su clase de entidad:

@NamedQuery(name="plane.getAll", query=NamedQueries.PLANE_GET_ALL) 

A continuación, defina una clase para sus constantes de consulta:

public class NamedQueries { 
    ... 
    public static final String PLANE_GET_ALL = "select p from Plane p"; 
    ... 
} 
+1

Esta solución no se trata de exteriorizar NamedQueries, se le acaba convirtiéndolos en propiedades de cadena sin formato de una clase. La semántica está perdida. – Augusto

3

Tal vez esto no es exactamente lo que el autor pidió (a exteriorizar archivo no Java), pero esto es cómo lo resolví:

1.) en mi archivo XML contexto de aplicación añadí mappingResources a sessionFactory

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mappingResources"> 
     <list> 
     <value>META-INF/Country.hbm.xml</value> 
     </list> 
    </property> 
    <property name="annotatedClasses"> 
     <util:list> 
      <value>com.example.Country</value> 
     </util:list> 
    </property> 
    <property name="hibernateProperties" ref="hibernateProperties" /> 
</bean> 

y en ese Country.hbm.xml tengo

<?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_2_0.xsd" 
    version="2.0"> 

    <entity class="com.example.Country"> 

     <named-query name="countryFindByCode"> 
      <query><![CDATA[ 
       select c 
        from Country c 
       where c.code = :code 
      ]]></query> 
     </named-query> 

     <named-query name="countryFindByName"> 
      <query><![CDATA[ 
       select c 
        from Country c 
       where c.name = :name 
      ]]></query> 
     </named-query> 

    </entity> 

</entity-mappings> 

he usado sólo para definir consultas con nombre, el resto de la configuración entidad está en annotat iones.

Quizás eso ayude a alguien.

-2
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mappingResources"> 
     <list> 
     <value>META-INF/Country.hbm.xml</value> 
     </list> 
    </property> 
    <property name="annotatedCla 
        from Country c 
       where c.name = :name 
      ]]></query> 
     </named-query> 

    </entity> 

</entity-mappings> 
+0

¿Alguna explicación más? –

Cuestiones relacionadas