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