2011-06-01 68 views
2

我對hibernate有點新,並試圖使用ehCache實現二級緩存。嘗試使用L2高速緩存來檢索多對一關聯時遇到問題。在我foo.hbm.xml文件的關聯映射是這樣的:對於多對一關聯的休眠L2緩存

<hibernate-mapping> 
    <class name="com.test.Foo" table="FOO" > 
     <id name="id" type="long"> 
      <column name="FOO_ID" precision="11" scale="0" /> 
      <generator class="assigned" /> 
     </id> 

     <many-to-one name="bar" class="com.test.Bar" > 
      <cache usage="read-only" /> 
      <column name="BAR_TY" not-null="true" /> 
      <column name="BAR_VAL" length="4" not-null="true" /> 
     </many-to-one> 

    </class> 
</hibernate-mapping> 

(這是我的實際hbm.xml文件中的一個很短/修改後的版本,它希望沒有錯誤)

注意我只緩存「酒吧」,而不是「富」。但是,當我使用此映射運行單元測試時,出現以下錯誤:

SEVERE:解析XML時出錯:XML InputStream(40)元素類型「多對一」的內容必須匹配「(meta * (列|式)*)」。

當我拿出它工作正常,只是沒有L2緩存。 難道多對一關係不支持緩存嗎?如果是這樣,有什麼建議如何解決這個問題?

僅供參考我有另一個直接讀取「bar」(即不通過關聯)的單元測試,它能正常工作 - 第二次我得到一個「bar」它從L2緩存中獲取它,所以我相當公平相信我已經正確完成了其餘的配置。對不起,仍然在工作中的石器時代,所以沒有註釋等。

回答

0

您是否試過將bar的定義轉換爲另一個獨立的.hbm.xml,並且僅從foo引用?

0

您的XML格式錯誤。 <many-to-one>內部是非法節點<cache>
hibernate-mapping-3.0.dtd

<!ELEMENT many-to-one (meta*,(column|formula)*)> 
    <!ATTLIST many-to-one name CDATA #REQUIRED> 
    <!ATTLIST many-to-one access CDATA #IMPLIED> 
    <!ATTLIST many-to-one class CDATA #IMPLIED> 
    <!ATTLIST many-to-one entity-name CDATA #IMPLIED> 
    <!ATTLIST many-to-one column CDATA #IMPLIED> 
    <!ATTLIST many-to-one not-null (true|false) #IMPLIED> 
    <!ATTLIST many-to-one unique (true|false) "false"> 
    <!ATTLIST many-to-one unique-key CDATA #IMPLIED> 
    <!ATTLIST many-to-one index CDATA #IMPLIED> 
    <!ATTLIST many-to-one cascade CDATA #IMPLIED> 
    <!ATTLIST many-to-one outer-join (true|false|auto) #IMPLIED> 
    <!ATTLIST many-to-one fetch (join|select) #IMPLIED> 
    <!ATTLIST many-to-one update (true|false) "true"> 
    <!ATTLIST many-to-one insert (true|false) "true"> 
    <!ATTLIST many-to-one optimistic-lock (true|false) "true"> 
    <!ATTLIST many-to-one foreign-key CDATA #IMPLIED> 
    <!ATTLIST many-to-one property-ref CDATA #IMPLIED> 
    <!ATTLIST many-to-one formula CDATA #IMPLIED> 
    <!ATTLIST many-to-one lazy (false|proxy|no-proxy) #IMPLIED> 
    <!ATTLIST many-to-one not-found (exception|ignore) "exception"> 
    <!ATTLIST many-to-one node CDATA #IMPLIED> 
    <!ATTLIST many-to-one embed-xml (true|false) "true"> 

緩存元件可以被放置在類級別:many-to-one元件上聲明bag

<hibernate-mapping> 
    <class name="com.test.Foo" table="FOO" > 
     <cache usage="read-only" /> 
     <id name="id" type="long"> 

或像set集合,map