2010-03-03 31 views
19

我試圖將我的命名查詢放在我的orm.xml中(放在META-INF和persistence.xml中),但是我的orm.xml似乎被hibernate忽略/ JPA。在orm.xml中使用jpa和hibernate定義命名查詢

當我嘗試使用em.createNamedQuery(「myQuery」)創建我的命名查詢時,它返回它無法找到此查詢。

我使用註釋,我想在orm.xml(僅此)中將我的命名查詢外部化。

這裏是我的persistence.xml:

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

這裏是我的orm.xml中

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

我做錯了嗎?爲什麼我的orm.xml被忽略?

感謝

+0

您的「帳戶」映射成功了嗎?即你可以做一個查詢,像'em.find(Account.class,someId)'? – Bozho 2010-03-03 19:56:29

+1

是的,我的帳戶映射良好,因爲我使用它成功地進行了註釋。 – 2010-03-04 14:31:02

回答

10

好吧,我終於得到了它!

我在META-INF目錄中保存了我的orm.xml文件。當我把這個文件移動到我的包含我的域對象的包中時(如我的示例:com.mysite),orm.xml不會被忽略,並且全部運行。

我還需要修改映射文件的路徑(persistence.xml中):COM/mysite的/ orm.xml中

+1

@Jerome C.很高興知道(+1)。我會嘗試。 – 2010-03-04 16:22:10

+0

爲什麼這被標記爲問題的答案? – 2015-07-15 17:49:52

+0

,因爲這是解決問題的答案;) – 2015-07-16 07:33:44

2

至於說

當我嘗試創建我的em.createNamedQuery( 「更改爲MyQuery」),它返回它無法找到該查詢命名查詢。

你說得對。但是你忘了以下

如果你把一個命名查詢定義一個元素中,而不是根,它的前綴是實體類的名稱

所以你需要調用您的namedQuery爲

em.createNamedQuery("Account.myQuery") 

我很好奇:您的Account類是否存儲在根類路徑中?如果沒有,你已經修復了缺失的軟件包。假設Account類存儲在br.com.hibernate.model.domain.Account中。所以,你應該申報的實體

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

而且你需要打電話給你namedQuery作爲

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

只是一個adivice:當您正在使用Hibernate作爲持久性提供,你不需要定義persistence.xml文件中的實體類。

問候,

+0

不錯,我懷疑這種類型的東西,但沒有在xsd中找到解釋。你可以鏈接那些寫的文檔嗎?這是規格嗎? – Bozho 2010-03-04 07:57:29

+0

@Bohzo Ok,Bohzo。使用Hibernate的Java持久性書:定義XML元數據中的命名查詢。除此之外,JPA規範對此進行了討論。 – 2010-03-04 13:53:09

+0

那不運行。我試過所有的解決方案。對於完整的路徑名,我認爲package標籤在這裏是爲了指定當你命名實體時使用的默認包,no? 爲了簡化,我還嘗試將命名查詢放入根實體映射標記中,但沒有結果。就像我說的,orm.xml被忽略,因爲如果我在xml中創建一個錯誤(沒有結束標記),我在休眠啓動時沒有錯誤... – 2010-03-04 14:34:06

0

「META-INF/orm.xml中」 是將要看着默認的映射文件由任何符合JPA標準的實體經理提供。實際上,如果你的映射文件是「META-INF/orm.xml」,你甚至不需要在你的persistence.xml中定義這個文件。

這是Hibernate配置手冊說一下:

類元素指定一個EJB3兼容XML映射文件,您將映射。該文件必須位於類路徑中。根據EJB3規範,Hibernate EntityManager將嘗試加載位於META_INF/orm.xml的jar文件中的映射文件。當然,任何顯式映射文件也將被加載。事實上,您可以在映射文件元素中提供任何XML文件。 hbm文件或EJB3部署描述符。

Reference: Hibernate configuration

4

你orm.xml中中有一個小錯誤,打破了整個事情。重點是元素聲明的順序應該符合各自的XML模式(尤其是http://java.sun.com/xml/ns/persistence/orm_1_0.xsd)。通過驗證xml模式的驗證器來運行xml代碼很容易。下面是你的orm.xml的修正版本,它必須作爲一個魅力工作。

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