Wie externalisieren ich benannte Abfragen in einer Hibernate Annotations app?
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?
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>