对多对一引用使用nHibernate辅助缓存

对多对一引用使用nHibernate辅助缓存,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我试图让nHibernate使用具有多对一关系的二级缓存,但是我找不到任何关于如何正确设置的明确解释。我发现了这一点,但Sjonny提供的示例是针对一对多的,当我采用它时,它对我不起作用。还有其他的帖子讨论这个问题,但没有一篇足够具体 我提供的XML配置可以工作(我必须进行大量编辑,所以“希望”可以工作),但只有在查询DataObject时检索查找对象时,才会缓存它们。我想知道1)在哪里/如何预加载LookupObject集合?2) 如果我将此集合分配给一个区域并设置过期时间,那么在何处/如何重

我试图让nHibernate使用具有多对一关系的二级缓存,但是我找不到任何关于如何正确设置的明确解释。我发现了这一点,但Sjonny提供的示例是针对一对多的,当我采用它时,它对我不起作用。还有其他的帖子讨论这个问题,但没有一篇足够具体

我提供的XML配置可以工作(我必须进行大量编辑,所以“希望”可以工作),但只有在查询DataObject时检索查找对象时,才会缓存它们。我想知道1)在哪里/如何预加载LookupObject集合?2) 如果我将此集合分配给一个区域并设置过期时间,那么在何处/如何重新加载缓存?3) 如何更改DataObject的hbm.xml,使nHibernate不会生成与查找表的联接,即,使查找对象始终来自辅助缓存,只从db获取DATA.LOOKUP\u ID,而不是LOOKUP.NAME

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

DataObject.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>
<?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) 为了预加载整个集合,我只需要更改代码,以便始终从数据库中提取并缓存整个查找列表,然后使用LINQ按ID获取单个对象。2) 和以前一样。3) 我还没有对此进行测试,但我需要将fetch=“join”从多个元素删除到一个元素,因为否则仍将生成SQL连接并返回数据。然后通过从缓存中获取查找对象来设置不带nHibernate的查找对象