使用nHibernate二级缓存进行多对一引用

时间:2012-02-09 20:02:35

标签: nhibernate nhibernate-mapping

我正在尝试让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。名字?

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>

1 个答案:

答案 0 :(得分:0)

我相信我回答了自己的问题。 1)为了预加载整个集合,我只需要更改我的代码,以便始终从DB中提取整个查找列表并缓存,然后通过ID获取LINQ的单个对象。 2)和以前一样。 3)我还没有测试过这个,但是我需要从多对一元素中删除fetch =“join”,否则仍然会生成SQL连接并且仍会返回数据。然后通过从缓存中获取查找对象而不设置nHibernate。