2009-03-02 11 views

Odpowiedz

9

Można umieścić zapytania do package-info.java klasie, w, powiedzmy, korzenia pakiet twoich obiektów domeny. Jednak należy używać własnych adnotacji Hibernowanego Hibernowanego @NamedQueries i @NamedQuery, a nie tych z javax.persistence.

Przykład package-info.java file:

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

package com.foo.domain; 

Następnie trzeba dodać pakiet do AnnotationConfiguration. Używam Spring, więc nie jest to kwestia ustawienia annonatedPackages właściwość:

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

Można również umieścić definicje typów i filtrów w tym samym pliku, jak również.

+0

Z mojego punktu widzenia nie jest to eksternalizacja zapytań - jest skompilowana w klasie i dla mnie ma dziesiątki zapytań w klasie encji lub jeszcze więcej zapytań w klasie informacji o pakiecie, który wybieram. IMHO to nie jest poprawna odpowiedź na to pytanie, nie mam pojęcia, dlaczego jest ona akceptowana -> -1 – Betlista

+0

+1 Dla mnie jest OK. Pokazuje, w jaki sposób można uzyskać dostęp za pomocą Java Config i XML. Przeczytaj pytanie przed obniżeniem, wyraźnie stwierdza, że ​​nie chce mieć NamedQueries w klasie. – Augusto

3

Nie sądzę, że jest to możliwe, ponieważ wartości atrybutu adnotacji/właściwości muszą być dostępne w czasie kompilacji. Dlatego ciągi nie mogą być uzewnętrzniane do pliku, który musi zostać wczytany przez jakiś proces.

Próbowałem dowiedzieć się, czy istnieje coś, co pakiet-info.java może dostarczyć, ale nie może znaleźć nic.

Alternatywna strategia organizacji może przechowywać kwerendy jako stałe w klasie.

W swojej klasie jednostki:

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

Następnie zdefiniowanie klasy dla swoich stałych zapytań:

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

Rozwiązanie to nie jest o uzewnętrzniania NamedQueries, jesteś po prostu zamieniając je w zwykłych właściwości Ciąg klasy. Semantyka jest stracona. – Augusto

3

Może to nie jest dokładnie to, co autor poprosił (uzewnętrznić do pliku non-Java), ale jest to w jaki sposób rozwiązać go:

1.) W mojej aplikacji pliku xml kontekstu dodałem mappingResources do 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> 

iw tym Country.hbm.xml mam

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

kiedyś, że po prostu zdefiniować nazwanych zapytań, reszta konfiguracji jednostka jest w annotat jony.

Może to pomaga komuś.

-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

Nie ma więcej wyjaśnień? –

Powiązane problemy