【问题标题】:NHibernate with Second Level Cache Not Rehydrating Properties Marked insert="false" update="false"?具有二级缓存的 NHibernate 不重新水化属性标记为 insert="false" update="false"?
【发布时间】:2012-11-14 19:56:17
【问题描述】:

在 Nhibernate 中实现二级缓存时遇到问题。我有一个类映射如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Data" namespace="Data">
   <class name="Account" table="Accounts" lazy="false">
     <cache region="Standard" usage="read-write" include="all"/>
     <id column="ID" name="ID">
       <generator class="assigned" />
     </id>
     <version name="VersionStamp" column="VersionStamp" type="integer" unsaved-value="0" />
     <property name="Name" not-null="true" />
     <property name="Type" not-null="true" />
     <property name="ClientID" not-null="true" insert="false" update="false" />
     <property name="DateCreated" not-null="true" type="UtcDateTime" />
     <property name="LastUpdatedDate" not-null="true" type="UtcDateTime" />
     <property name="IsActive" not-null="true" />
     <many-to-one name="Client" class="Client" column="ClientID" not-found="exception" not-null="true" />
   </class>
 </hibernate-mapping>

“ClientID”属性是 Clients 表的外键,Client 多对一属性使用它来查找关联的客户端对象。

当我添加一个新帐户时,我使用 Session.Get 从数据库中查找 Client 对象并将其分配给我的 Account 对象的 Client 属性。在幕后,当对象写入数据库时​​,这也会自动填充 ClientID 属性,并且 ID 正确存储在数据库中。当我使用 Session.Get 按 ID 从数据库中检索 Account 对象时,检索对象时所有字段都正确填充。

但是,当我使用上面显示的设置实现二级缓存时,使用 Session.Get 检索 Account 对象时不会填充 ClientID 属性,但会正确填充 Client 属性。是否有某些原因为什么这不适用于二级缓存?还是我在映射/配置中做错了什么?

现在我只是使用 SysCache 作为我的缓存提供程序,并且查询和二级缓存都打开了。 Client 类映射包含 Accounts 对应的一对多属性。

我喜欢在我的 Account 类中使用 ClientID 属性的便利性,这样我就可以在不使用 Client 属性的情况下读取它,而且它似乎在没有缓存的情况下也能正常工作。

感谢您的帮助。

丰富

【问题讨论】:

    标签: nhibernate nhibernate-caches


    【解决方案1】:

    我试图在本地重现您的情况。使用您的映射(与上面的 sn-p 使用相同),我只能在 UPDATE 上获得不正确的行为。在这种情况下,ClientID 被缓存,而 Client 引用已更改,ClientID 保持不变。在其他情况下,缓存按预期工作。

    解决方案是更改映射。以下建议的映射最适合 ClientID 等只读属性。 (我也在使用这种方法)。

    <property name="ClientID" formula="[ClientId]" 
            not-null="true" insert="false" update="false" />
    

    所以诀窍在于 formula 映射而不是 Column(未提供时的默认值)

    【讨论】:

    • 谢谢,Radim。这似乎解决了问题。我假设 [] 周围的字段名称是公式所必需的。 [] 是否可以用于所有数据库,或者如果我更改后端数据库,是否需要指定不同的公式?
    • 是的,有不同的映射! ;) 我在连接到 MS SQL Server 时使用它。但不确定它是否会对其他数据库引擎造成一些损害。太好了,它有帮助! ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2010-09-09
    • 2011-06-21
    • 1970-01-01
    相关资源
    最近更新 更多