Comment externaliser des requêtes nommées dans une application d'annotation Hibernate?

StackOverflow https://stackoverflow.com/questions/602397

  •  03-07-2019
  •  | 
  •  

Question

Existe-t-il un moyen d’externaliser les requêtes nommées HQL vers un fichier externe? J'ai trop de requêtes nommées et utiliser @NamedQueries et @NamedQuery à la tête de mes classes d'entités me fait mal.

Existe-t-il un moyen d'externaliser plusieurs fichiers?

Était-ce utile?

La solution

Vous pouvez placer les requêtes dans la classe package-info.java , dans, par exemple, le package racine de vos objets de domaine. Cependant, vous devez utiliser les propres 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;

Ensuite, vous devez ajouter le package à votre AnnotationConfiguration . J'utilise Spring. Il suffit donc de définir la propriété annoncée par packages :

<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 également placer des définitions de type et de filtre dans le même fichier.

Autres conseils

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 être capable de fournir, mais je n'ai rien trouvé.

Une autre stratégie pour l'organisation pourrait être de 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";
    ...
}

Peut-être que ce n'est pas exactement ce que l'auteur a demandé (externaliser en fichier non-Java), mais voici comment je l'ai résolu:

1.) dans mon fichier xml de contexte d'application, 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 dans ce pays.hbm.xml j'ai

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

J'ai utilisé cela juste pour définir des requêtes nommées, le reste de la configuration de l'entité est dans les annotations.

Peut-être que cela aide quelqu'un.

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top