2009-03-02 5 views

Répondre

9

Vous pouvez mettre les requêtes en package-info.java classe, dans, disons, racine package de vos objets de domaine. Cependant, vous devez utiliser les annotations @NamedQueries et @NamedQuery d'Hibernate, plutôt que celles de javax.persistence.

Exemple de fichier package-info.java:

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

package com.foo.domain; 

, vous devez alors ajouter le package à votre AnnotationConfiguration. J'utilise Spring, donc là, il est question de la mise en annonatedPackages propriété:

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

Vous pouvez aussi mettre des définitions de type et de filtrage dans le même fichier ainsi.

+0

De mon point de vue, ce n'est pas une externalisation de requêtes - c'est compilé en classe et pour moi d'avoir des dizaines de requêtes dans la classe entité ou encore plus de requêtes dans la classe package-info je vais choisir entity. Je ne sais pas pourquoi c'est accepté -> -1 – Betlista

+0

+1 Pour moi, c'est ok. Il montre comment externaliser en utilisant Java Config et XML. Lire la question avant downvoting, il indique clairement qu'il ne veut pas avoir les NamedQueries à l'intérieur de la classe. – Augusto

3

Je ne pense pas que cela soit possible car les valeurs d'attribut/propriété d'annotation doivent être disponibles au moment de la compilation. Par conséquent, les chaînes ne peuvent pas être externalisées dans un fichier qui doit être lu par un processus quelconque.

J'ai essayé de trouver s'il y avait quelque chose que package-info.java pourrait fournir, mais n'a rien trouvé.

Une stratégie alternative pour l'organisation pourrait consister à stocker les requêtes en tant que constantes dans une classe.

Dans votre classe d'entité:

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

Définissez ensuite une classe pour vos constantes de requête:

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

Cette solution ne consiste pas à extérioriser namedqueries, vous êtes juste de les transformer en propriétés de chaîne simple d'une classe. La sémantique est perdue. – Augusto

3

Peut-être que ce n'est pas exactement ce que l'auteur demandé (à extérioriser dans un fichier non-java), mais voici comment je l'ai résolu:

1.) dans mon contexte l'application fichier xml j'ai ajouté mappingResources à 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> 

et que je Country.hbm.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_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> 

que j'ai utilisé juste pour définir des requêtes nommées, le reste de la configuration de l'entité est en annotat ions.

Peut-être que cela aide quelqu'un.

-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

Un peu plus d'explications? –

Questions connexes