2010-03-03 28 views
19

Tôi đang cố gắng đặt các truy vấn được đặt tên trong tệp orm.xml của mình (được đặt trong META-INF với persistence.xml) nhưng tệp orm.xml của tôi có vẻ bị bỏ qua bởi hibernate/jpa.xác định truy vấn được đặt tên trong orm.xml với jpa và hibernate

Khi tôi cố gắng tạo truy vấn được đặt tên với em.createNamedQuery ("myQuery"), nó trả về rằng nó không thể tìm thấy truy vấn này.

Tôi sử dụng chú thích và tôi muốn mở rộng các truy vấn được đặt tên của mình trong tệp orm.xml (chỉ có vậy).

Đây là persistence.xml tôi:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> 

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> 
    <mapping-file>META-INF/orm.xml</mapping-file> 

    <class>com.mysite.Account</class> 

    <properties> 
     <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /> 
     <property name="hibernate.cache.use_query_cache" value="true" /> 
     <property name="hibernate.cache.use_second_level_cache" value="true" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
     <property name="use_sql_comments" value="false" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MYSQLDialect" /> 
     <property name="hibernate.c3p0.min_size" value="5" /> 
     <property name="hibernate.c3p0.max_size" value="20" /> 
     <property name="hibernate.c3p0.timeout" value="300" /> 
     <property name="hibernate.c3p0.max_statements" value="50" /> 
     <property name="hibernate.c3p0.idle_test_period" value="3000" /> 

     <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider" /> 
    </properties> 

</persistence-unit> 

</persistence> 

đây là orm.xml tôi

<?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_1_0.xsd" version="1.0"> 

<package>com.mysite</package> 

<entity class="Account"> 
    <sql-result-set-mapping name="nicknames"> 
     <column-result name="nickname" /> 
    </sql-result-set-mapping> 
    <table name="Account" /> 
    <named-native-query name="myQuery" result-set-mapping="nicknames"> 
     <query><![CDATA[select a.nickname from Account a]]> 
    </query> 
    </named-native-query> 
</entity> 
</entity-mappings> 

Những gì tôi đang làm sai? Tại sao orm.xml của tôi bị bỏ qua?

nhờ

+0

Tài khoản 'của bạn đã được ánh xạ thành công chưa? I E. bạn có thể tạo một truy vấn như 'em.find (Account.class, someId)'? – Bozho

+1

có Tài khoản của tôi được ánh xạ tốt, bởi vì tôi sử dụng nó thành công với chú thích. –

Trả lời

10

Ok cuối cùng tôi đã hiểu!

Tôi đã lưu tệp orm.xml của mình trong thư mục META-INF. Khi tôi di chuyển tệp này vào gói của tôi, nơi tôi có đối tượng miền của mình (như trong ví dụ của tôi: com.mysite), thì tệp orm.xml không bị bỏ qua và tất cả đều chạy.

Tôi cũng cần phải thay đổi đường dẫn trong bản đồ-file (persistence.xml): com/mysite/orm.xml

+1

@Jerome C. Điều cần biết (+1). Tôi sẽ thử nó. –

+0

tại sao điều này được đánh dấu là câu trả lời cho câu hỏi? –

+0

vì đây là câu trả lời đã giải quyết được vấn đề của câu hỏi;) –

2

Như đã nói

Khi tôi cố gắng tạo ra truy vấn có tên của tôi với em.createNamedQuery ("myQuery"), nó sẽ trả về mà nó không thể tìm thấy câu hỏi này.

Bạn nói đúng. Nhưng bạn quên sau

Nếu bạn đặt một định nghĩa truy vấn tên bên trong một phần tử, thay vì gốc rễ, nó được bắt đầu bằng tên của lớp thực thể

Vì vậy, bạn cần phải gọi tên được đặt tên của bạn là

em.createNamedQuery("Account.myQuery") 

Tôi tò mò: Lớp Tài khoản của bạn có được lưu trữ trong đường dẫn lớp gốc không ??? Nếu không, bạn đã sửa chữa gói bị mất của nó. Giả sử lớp tài khoản được lưu trữ bên trong br.com.hibernate.model.domain.Account. Vì vậy, bạn nên khai báo thực thể của bạn như

<entity class="br.com.hibernate.model.domain.Account" instead 

Và bạn cần phải gọi namedQuery của bạn như

em.createNamedQuery("br.com.hibernate.model.domain.Account.myQuery") instead 

Chỉ cần một adivice: khi bạn đang sử dụng Hibernate như Provider Persistence của bạn, bạn không cần phải xác định của bạn Lớp thực thể trong tệp persistence.xml.

liên quan,

+0

tốt đẹp, tôi nghi ngờ một cái gì đó của loại này, nhưng không tìm thấy lời giải thích trong xsd. Bạn có thể liên kết các tài liệu được viết ở đâu không? Nó là spec? – Bozho

+0

@Bohzo Ok, Bohzo. Java Persistence với cuốn sách Hibernate: Xác định truy vấn được đặt tên trong siêu dữ liệu XML. Bên cạnh đó, đặc điểm kỹ thuật JPA nói về nó. –

+0

Điều đó không chạy. Tôi đã thử tất cả các giải pháp. Đối với tên đường dẫn đầy đủ, tôi đã nghĩ rằng thẻ gói đã ở đây để chỉ định gói mặc định để sử dụng khi bạn đặt tên một thực thể, phải không? Để đơn giản hóa, tôi cũng đã cố gắng đặt truy vấn được đặt tên trong thẻ ánh xạ thực thể gốc mà không có kết quả. Như tôi đã nói, orm.xml bị bỏ qua vì nếu tôi tạo lỗi trong xml của tôi (không có thẻ kết thúc), tôi không gặp lỗi khi khởi động ngủ đông ... –

0

"META-INF/orm.xml" là tập tin bản đồ mặc định sẽ được xem xét theo bất kỳ người quản lý thực thể tuân thủ JPA nào.

Thực tế, nếu tệp ánh xạ của bạn là "META-INF/orm.xml", bạn thậm chí không cần phải xác định điều đó trong tệp persistence.xml của mình.

Đây là những gì cấu hình thủ công Hibernate nói về điều này:

Yếu tố lớp chỉ định một EJB3 compliant tập tin bản đồ XML mà bạn sẽ lập bản đồ. Tệp phải nằm trong classpath. Theo đặc tả EJB3, Hibernate EntityManager sẽ cố tải tệp ánh xạ nằm trong tệp jar tại META_INF/orm.xml. Tất nhiên, mọi tệp ánh xạ rõ ràng cũng sẽ được tải. Trên thực tế, bạn có thể cung cấp bất kỳ tệp XML nào trong phần tử tệp ánh xạ tức là. tệp hbm hoặc bộ mô tả triển khai EJB3.

Reference: Hibernate configuration

4

orm.xml của bạn có một lỗi nhỏ trong nó mà phá vỡ toàn bộ điều. Vấn đề là trình tự các khai báo của các phần tử phải tuân theo lược đồ XML tương ứng (cụ thể là http://java.sun.com/xml/ns/persistence/orm_1_0.xsd). Điều đó rất dễ dàng để kiểm tra bằng cách chạy mã xml thông qua trình xác nhận hợp lệ, biểu thị các lược đồ xml. Bên dưới là phiên bản được sửa chữa của tệp orm.xml của bạn.

<?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_1_0.xsd" 
       version="1.0"> 

    <package>com.mysite</package> 

    <entity class="Account"> 
     <table name="Account" /> 
     <named-native-query name="myQuery" result-set-mapping="nicknames"> 
      <query><![CDATA[ 
      select a.nickname from Account a 
      ]]></query> 
     </named-native-query> 
     <sql-result-set-mapping name="nicknames"> 
      <column-result name="nickname" /> 
     </sql-result-set-mapping> 
    </entity> 
</entity-mappings> 
Các vấn đề liên quan