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

NHibernate:如果对CreateCriteria进行了两次调用,那么哪个列表是Get<;T>;要从中检索对象吗?,nhibernate,caching,Nhibernate,Caching,在一个工作单元(会话)下,我可以调用CreateCriteria两次。我的第一个调用是填充网格以进行数据编辑假设数据已编辑并刷新(保存)到数据库,网格仍处于打开状态。编辑完数据后,我可能会再次调用CreateCriteria来检索经过验证并发现错误的对象列表 假设对session.CreateCriteria的两个调用都检索到了ObjectA。在网格中对其进行了编辑,但在第二个列表中发现了错误 第一个问题是:考虑到一级缓存,ObjectA——从对CreateCriteri的第二次调用中检索到的—

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

假设对session.CreateCriteria的两个调用都检索到了ObjectA。在网格中对其进行了编辑,但在第二个列表中发现了错误

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

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

提前感谢。

二级缓存 看一看

来自前者:

第二级缓存不保存 实体,但值的集合

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

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

撇开验证不谈,我想你要问的是,如果你:

  • 保存一些东西
  • 冲水
  • 使用与步骤1中保存的项目相同的密钥检索项目(从新会话)
  • 您是否将检索与步骤1中保存的对象相同的引用(?)。答案是否定的,因为NHibernate不缓存对象,而是缓存值,这样它就可以创建一个新的实体来填充缓存的值(而不是实际执行DB查询)

    然而,这真的重要吗?如果重载Equals,使两个实体的相等基于它们的ID,那么在网格(或任何类型的散列)中查找相同的(不是引用equal,而是相同的)项应该是一个简单的过程


    一级缓存 我不知道你说的是一级缓存。第一级缓存用作标识映射,并缓存对象的实例。因此,如果您基于相同的ID从数据库中进行2次选择,您将检索对象的相同实例。

    二级缓存 看一看

    来自前者:

    第二级缓存不保存 实体,但值的集合

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

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

    撇开验证不谈,我想你要问的是,如果你:

  • 保存一些东西
  • 冲水
  • 使用与步骤1中保存的项目相同的密钥检索项目(从新会话)
  • 您是否将检索与步骤1中保存的对象相同的引用(?)。答案是否定的,因为NHibernate不缓存对象,而是缓存值,这样它就可以创建一个新的实体来填充缓存的值(而不是实际执行DB查询)

    然而,这真的重要吗?如果重载Equals,使两个实体的相等基于它们的ID,那么在网格(或任何类型的散列)中查找相同的(不是引用equal,而是相同的)项应该是一个简单的过程


    一级缓存
    我不知道你说的是一级缓存。第一级缓存用作标识映射,并缓存对象的实例。因此,如果您根据相同的ID从数据库中进行2次选择,您将检索对象的相同实例。

    感谢您的回复。我不确定你回答的上下文是关于二级缓存还是一级缓存。第一个层次是我问题的背景,根据背景,我假设答案会有所不同。我希望您的答案是关于一级缓存的,并且在同一个会话/工作单元内,因为我还没有准备好/准备好实现二级缓存。我会在插入之前进行验证,但并非所有的验证都适用于当时——例如,远程和断开连接的应用程序可能没有最新版本的验证数据。此外,我确实实现了equals,因此根据您的回答,我假设Get操作查看该方法以比较缓存中的对象。话虽如此,CreateCriteria在第二次获得对象列表后,是否会将这些对象与缓存进行比较?如果是这样的话,如果一个值在第一次使用CreateCriteria从数据库中提取后发生了更改,会发生什么情况?很抱歉,我假设您谈论的是二级缓存(检索原始检索会话范围之外的对象),因为这是一个很多人都有abo的问题