2009-03-02 24 views

Trả lời

9

Bạn có thể đặt các truy vấn vào package-info.java lớp, ở, nói rằng, gốc gói các đối tượng miền của bạn. Tuy nhiên, bạn phải sử dụng các chú thích @NamedQueries@NamedQuery riêng của Hibernate, thay vì các chú thích từ javax.persistence.

Ví dụ package-info.java file:

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

package com.foo.domain; 

Sau đó, bạn cần phải thêm các gói để AnnotationConfiguration của bạn. Tôi sử dụng mùa xuân, vì vậy đó là một vấn đề của thiết annonatedPackages tài sản:

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

Bạn cũng có thể đặt loại và lọc các định nghĩa trong cùng một tập tin là tốt.

+0

Từ quan điểm của tôi, đây không phải là truy vấn bên ngoài - nó được biên dịch trong lớp và cho tôi có hàng tá truy vấn trong lớp thực thể hoặc thậm chí nhiều truy vấn hơn trong lớp gói-thông tin tôi sẽ chọn thực thể. IMHO đây không phải là câu trả lời đúng cho câu hỏi này, tôi không biết tại sao nó được chấp nhận -> -1 – Betlista

+0

+1 Đối với tôi, điều đó là ổn. Nó cũng cho thấy cách sử dụng Java Config và XML. Đọc câu hỏi trước khi downvoting, nó nói rõ rằng anh ta không muốn có các NamedQueries bên trong lớp. – Augusto

3

Tôi không nghĩ rằng điều này là có thể vì thuộc tính Chú thích/giá trị thuộc tính phải có sẵn tại thời gian biên dịch. Do đó, các chuỗi không thể được bên ngoài thành một tệp cần được đọc bởi một số loại quy trình.

Tôi đã cố gắng tìm xem có thứ gì mà gói-info.java có thể cung cấp không, nhưng không thể tìm thấy bất kỳ thứ gì.

Một chiến lược thay thế cho tổ chức có thể lưu trữ các truy vấn dưới dạng các hằng số trong một Lớp.

Trong lớp thực thể của bạn:

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

Sau đó định nghĩa một lớp cho các hằng số truy vấn của bạn:

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

Giải pháp này không phải là về bên ngoài NamedQueries, bạn chỉ cần chuyển chúng thành các thuộc tính chuỗi đơn giản của một lớp. Ngữ nghĩa bị mất. – Augusto

3

Có lẽ đây không phải là chính xác những gì tác giả yêu cầu (để ra bên ngoài để tập phi java), nhưng đây là cách tôi giải quyết nó:

1.) trong ứng dụng tập tin xml bối cảnh của tôi, tôi thêm 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> 

và trong Country.hbm.xml rằng tôi có

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

tôi sử dụng mà chỉ để xác định các truy vấn tên, phần còn lại của cấu hình thực thể là trong annotat ion.

Có thể giúp ai đó.

-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

Ít giải thích hơn? –

Các vấn đề liên quan