NHibernate:如果对CreateCriteria进行了两次调用,那么哪个列表是Get<;T>;要从中检索对象吗?
在一个工作单元(会话)下,我可以调用CreateCriteria两次。我的第一个调用是填充网格以进行数据编辑假设数据已编辑并刷新(保存)到数据库,网格仍处于打开状态。编辑完数据后,我可能会再次调用CreateCriteria来检索经过验证并发现错误的对象列表 假设对session.CreateCriteria的两个调用都检索到了ObjectA。在网格中对其进行了编辑,但在第二个列表中发现了错误 第一个问题是:考虑到一级缓存,ObjectA——从对CreateCriteri的第二次调用中检索到的——是否代表从第一次调用中检索到的?或者,更好的是,假设密钥没有更改,NHibernate是否从第一次调用中“检测并重用”ObjectA 关于我的最后一点:我想编辑发现错误的ObjectA,假设它是在列表框中提出的。因此,我想突出显示该对象,调用session.Get()(key)以便从缓存中检索它,然后打开一个更改表单来更改ObjectA的属性。我在改变哪一个对象?是第一次调用CreateCriteria还是第二次调用?它们是一样的吗 提前感谢。二级缓存 看一看 来自前者: 第二级缓存不保存 实体,但值的集合 因此,通过正确的缓存设置,NHibernate将能够重新创建对象,而无需从数据库获取实际值。换句话说,对象的创建方式与不在缓存中时相同,只是由于值被缓存,NHibernate实际上不会查询数据库,因为它已经知道其中的内容 我不太清楚你所说的“验证”和“发现错误”是什么意思。是否在插入前进行验证?通常,我的实体在插入/更新之前进行验证,如果无效,则不会实际插入/更新 撇开验证不谈,我想你要问的是,如果你:NHibernate:如果对CreateCriteria进行了两次调用,那么哪个列表是Get<;T>;要从中检索对象吗?,nhibernate,caching,Nhibernate,Caching,在一个工作单元(会话)下,我可以调用CreateCriteria两次。我的第一个调用是填充网格以进行数据编辑假设数据已编辑并刷新(保存)到数据库,网格仍处于打开状态。编辑完数据后,我可能会再次调用CreateCriteria来检索经过验证并发现错误的对象列表 假设对session.CreateCriteria的两个调用都检索到了ObjectA。在网格中对其进行了编辑,但在第二个列表中发现了错误 第一个问题是:考虑到一级缓存,ObjectA——从对CreateCriteri的第二次调用中检索到的—
一级缓存 我不知道你说的是一级缓存。第一级缓存用作标识映射,并缓存对象的实例。因此,如果您基于相同的ID从数据库中进行2次选择,您将检索对象的相同实例。二级缓存 看一看 来自前者: 第二级缓存不保存 实体,但值的集合 因此,通过正确的缓存设置,NHibernate将能够重新创建对象,而无需从数据库获取实际值。换句话说,对象的创建方式与不在缓存中时相同,只是由于值被缓存,NHibernate实际上不会查询数据库,因为它已经知道其中的内容 我不太清楚你所说的“验证”和“发现错误”是什么意思。是否在插入前进行验证?通常,我的实体在插入/更新之前进行验证,如果无效,则不会实际插入/更新 撇开验证不谈,我想你要问的是,如果你:
一级缓存
我不知道你说的是一级缓存。第一级缓存用作标识映射,并缓存对象的实例。因此,如果您根据相同的ID从数据库中进行2次选择,您将检索对象的相同实例。感谢您的回复。我不确定你回答的上下文是关于二级缓存还是一级缓存。第一个层次是我问题的背景,根据背景,我假设答案会有所不同。我希望您的答案是关于一级缓存的,并且在同一个会话/工作单元内,因为我还没有准备好/准备好实现二级缓存。我会在插入之前进行验证,但并非所有的验证都适用于当时——例如,远程和断开连接的应用程序可能没有最新版本的验证数据。此外,我确实实现了equals,因此根据您的回答,我假设Get操作查看该方法以比较缓存中的对象。话虽如此,CreateCriteria在第二次获得对象列表后,是否会将这些对象与缓存进行比较?如果是这样的话,如果一个值在第一次使用CreateCriteria从数据库中提取后发生了更改,会发生什么情况?很抱歉,我假设您谈论的是二级缓存(检索原始检索会话范围之外的对象),因为这是一个很多人都有abo的问题