Frage

Gibt es eine Möglichkeit HQL externalisieren Abfragen an eine externe Datei mit dem Namen. Ich habe zu viele benannte Abfragen und mit @NamedQueries und @NamedQuery an der Spitze meiner Entitäten Klassen verletzt.

Gibt es eine Möglichkeit, um mehrere Dateien zu externalisieren?

War es hilfreich?

Lösung

Sie können die Abfragen in package-info.java Klasse setzen, in, sagen wir, Root-Paket Ihrer Domain-Objekte. Hibernate eigene @NamedQueries und @NamedQuery Anmerkungen, anstatt diejenigen, Sie müssen jedoch von javax.persistence 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 müssen 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 können auch als auch Art und Filterdefinitionen in der gleichen Datei setzen.

Andere Tipps

Ich glaube nicht, dass dies möglich ist, als Annotation Attribut / Eigenschaftswert bei der Kompilierung zur Verfügung stehen müssen. Daher Strings können nicht in einer Datei externalisiert werden, die durch irgendeine Art von Prozess eingelesen werden muss.

Ich habe versucht zu finden, wenn es etwas gab, das package-info.java könnte, um der Lage sein, konnte aber nichts finden.

Eine alternative Strategie für die Organisation könnte die Abfragen als Konstanten in einer Klasse zu speichern.

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";
    ...
}

Vielleicht ist das nicht genau das, was Autor gefragt (externalisieren zu Nicht-Java-Datei), 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 Anmerkungen.

Vielleicht hilft jemand.

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top