NHibernate:如果对CreateCriteria进行了两次调用,哪个列表是Get <t>要从中检索对象?</t>

时间:2010-02-09 17:41:06

标签: nhibernate caching

在一个UnitOfWork(会话)下,我可以两次调用CreateCriteria。我的第一个电话是填充网格以进行数据编辑。 假设已将数据编辑并刷新(保存)到数据库,网格仍处于打开状态。在编辑数据之后,我可以再次调用CreateCriteria来检索经过验证并发现错误的对象列表。

让我们说两个对session.CreateCriteria的调用都检索到ObjectA。它在网格中编辑,但在第二个列表中发现错误。

第一个问题是:考虑第一级缓存,是从第二次调用CreateCriteri中检索到的ObjectA - 表示从第一次调用中检索到的那个?或者,更好的是,NHibernate在第一次调用时“检测并重用”ObjectA,假设密钥没有改变?

至于我的最后一点:我想编辑错误发现的ObjectA,让我们说它是在ListBox中提出的。因此,我想突出显示该对象,调用session.Get()(key)以便从缓存中检索它,然后调出一个更改表单来更改ObjectA的属性。我在改变哪个对象?从第一次调用CreateCriteria还是第二次调用?它们是一样的吗?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

二级缓存

查看http://ayende.com/Blog/archive/2006/07/24/DeepDivingIntoNHibernateTheSecondLevelCache.aspxhttp://www.javalobby.org/java/forums/t48846.html

来自前者:

  

二级缓存不成立   实体,但值集合

因此,通过正确的缓存设置,NHibernate将能够重新创建您的对象,而无需从数据库中获取实际值。换句话说,对象的创建方式与它不在缓存中时相同,除非由于缓存了值,因此NHibernate实际上不会查询数据库,因为它已经知道了什么在那里

我不太确定“验证”和“发现错误”是什么意思。你在插入前验证了吗?通常,我的实体在插入/更新之前进行验证,如果无效,则实际上不会插入/更新。

除了验证之外,我认为你问的是,如果你:

  1. 保存一些东西
  2. 做一个同花顺
  3. 使用与步骤1中保存的密钥相同的密钥检索项目(来自新会话)
  4. 您将检索对您在步骤1中保存的对象的相同引用(?)。答案是否定的,因为NHibernate不会缓存OBJECT而是缓存值,因此它可以创建一个填充了缓存值的新实体(而不是实际执行数据库查询)。

    然而,这真的很重要吗?如果重载Equals使得2个实体的相等性基于它们的ID,那么在网格(或任何类型的散列)中找到相同(不是引用相同但相同)的项应该是快速的。


    第一级缓存

    我没有意识到你在谈论一级缓存。第一级缓存用作身份映射,并缓存对象的实例。因此,如果您基于相同的ID从数据库中选择2,则将检索该对象的相同实例。