2009-03-02 5 views

Antwort

9

Sie können die Abfragen in package-info.java Klasse setzen, in, sagen wir, Wurzel Paket Ihrer Domain-Objekte. Sie müssen jedoch die @NamedQueries- und @NamedQuery-Annotationen von Hibernate anstelle der -Annotationen verwenden.

Beispiel package-info.java Datei:

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

package com.foo.domain; 

Dann haben Sie das Paket zu Ihrem AnnotationConfiguration hinzuzufügen. Ich verwende Spring, so gibt es es eine Frage der Einstellung annonatedPackages Eigenschaft:

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

Sie auch als auch Art und Filterdefinitionen in der gleichen Datei setzen.

+0

Aus meiner Sicht ist dies keine Abfrage Externalisierung - es ist in der Klasse kompiliert und für mich Dutzende von Abfragen in der Entitätsklasse oder noch mehr Abfragen in der Paket-Info-Klasse Ich werde die Entität wählen. IMHO ist dies nicht die richtige Antwort für diese Frage, ich habe keine Ahnung, warum es akzeptiert wird -> -1 – Betlista

+0

+1 Für mich ist es in Ordnung. Es zeigt, wie man mit Java Config und XML auch externalisiert. Lesen Sie die Frage vor dem Abstimmen, es wird deutlich gesagt, dass er die NamedQueries nicht innerhalb der Klasse haben möchte. – Augusto

3

Ich glaube nicht, dass dies möglich ist, da Annotationsattribute/Eigenschaftswerte zur Kompilierzeit verfügbar sein müssen. Daher können Strings nicht für eine Datei externalisiert werden, die von einem Prozess eingelesen werden muss.

Ich habe versucht zu finden, ob es etwas gab, das package-info.java liefern könnte, konnte aber nichts finden.

Eine alternative Strategie für die Organisation könnte das Speichern der Abfragen als Konstanten in einer Klasse sein.

In Ihrer Entity-Klasse:

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

Dann eine Klasse für Ihre Abfrage Konstanten definieren:

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

Diese Lösung ist etwa nicht NamedQueries Externalisierung, Sie sind nur sie in einfache String Eigenschaften einer Klasse drehen. Die Semantik ist verloren. – Augusto

3

Vielleicht ist das nicht genau das, was Autor gefragt (Nicht-Java-Datei externalisieren zu), aber das ist, wie ich es gelöst:

1.) in meinem Anwendungskontext xml-Datei hinzugefügt I mappingResources zu session

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

und in diesem Country.hbm.xml ich habe

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

Früher habe ich, dass nur benannte Abfragen zu definieren, ist der Rest der Einheit-Konfiguration in annotat Ionen.

Vielleicht hilft das jemandem.

-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

Wenig mehr Erklärung? –