2012-02-09 55 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的查找对象。