2012-02-09 54 views
0

我試圖讓nHibernate使用二級緩存與多對一的關係,但是我找不到任何關於如何設置的明確解釋它正確。我發現這How to get nhibernate to cache tables referenced via many-to-one - is my config correct?,但sJHonny提供的示例是一對多的,當我採用它時,它不適用於我。還有其他文章討論這個問題,但沒有一個足夠具體。我提供的XML配置工作(我不得不大幅編輯,所以「希望」才起作用),但查找對象只有在查詢DataObject時纔會被緩存。我想知道1)在哪裏/如何預加載LookupObject集合? 2)如果我將這個集合分配給一個區域並設置過期,那麼我該如何重新加載緩存? 3)如何更改DataObject的hbm.xml,使nHibernate不會與LOOKUP表生成連接,即查找對象始終來自二級緩存,只從數據庫獲取DATA.LOOKUP_ID,而不是LOOKUP。名稱?使用nHibernate二級緩存進行多對一參考

LookupObject.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="BusinessObjects" assembly="BusinessObjects"> 
    <class name="LookupObject" table="LOOKUP" mutable="false" batch-size="20"> 
    <cache usage="read-only" /> 
    <id name="Id" column="ID" /> 
    <property name="Name" column="NAME" /> 
    </class> 
</hibernate-mapping> 

DataObject.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="BusinessObjects" assembly="BusinessObjects"> 
    <class name="DataObject" 
     table="DATA" mutable="false"> 
    <composite-id> 
     <key-property name="Id" column="ID"/> 
     <key-property name="Date" column="DATE" type="Date"/> 
    </composite-id> 
    <many-to-one name="LookupObject" not-null="true" column="LOOKUP_ID" fetch="join"> 
    </class> 
</hibernate-mapping> 

回答

0

我相信我回答了我自己的問題。 1)爲了預加載整個集合,我只需要更改我的代碼,以便始終從數據庫中提取整個查找列表並進行緩存,然後使用LINQ獲取單個對象的ID。 2)和以前一樣。 3)我還沒有測試過,但我需要從多對一的元素中刪除fetch =「join」,否則SQL連接仍然會生成,數據仍然會返回。然後通過從緩存中獲取它來設置沒有nHibernate的查找對象。