gpt4 book ai didi

nhibernate - NHibernate ICriteria 查询是缓存还是放在身份映射中?

转载 作者:行者123 更新时间:2023-12-03 09:41:02 26 4
gpt4 key购买 nike

使用 NHibernate 我通常使用 Get() 或 Load() 方法查询单个记录(取决于我是否需要代理):

SomeEntity obj = session.Get<SomeEntity>(new PrimaryKeyId(1));

现在,如果我执行此语句两次,如下例所示,我只会看到在我的单元测试中执行了一个查询:
SomeEntity obj1 = session.Get<SomeEntity>(new PrimaryKeyId(1));
SomeEntity obj2 = session.Get<SomeEntity>(new PrimaryKeyId(1));

到现在为止还挺好。但是在使用 ICriteria 查询获取相同对象时,我注意到了一些奇怪的行为。在下面查看我的代码:我得到第一个对象实例。然后我将一个属性的值更改为 10(数据库中的值为 8),获取另一个实例,最后检查第二个对象实例的值。
//get the first object instance.
SomeEntity obj1 = session.CreateCriteria(typeof(SomeEntity))
.Add(Restrictions.Eq("Id", new PrimaryKeyId(1)))
.UniqueResult<SomeEntity>();

//the value in the database and the property is 8 at this point. Let's set it to 10.
obj1.SomeValue = 10;

//get the second object instance.
SomeEntity obj2 = session.CreateCriteria(typeof(SomeEntity))
.Add(Restrictions.Eq("Id", new PrimaryKeyId(1)))
.UniqueResult<SomeEntity>();

//check if the values match.
Assert.AreEqual(8, obj2.SomeValue);

现在,由于某种原因,断言失败了,因为即使我使用新查询请求对象,值也是 obj2 的 10。有趣的是,根据我的单元测试输出窗口,有 2 个完全相同的选择查询正在执行。我的问题:如果从一级缓存中获取第二个对象,为什么要执行 2 个查询?

我错过了什么还是这是一个错误?

问候,泰德

编辑 #1:使用 NHibernate v2.1.2GA
编辑 #2:我在最后一段中添加了一些关于正在执行的 2 个查询的额外解释。

最佳答案

好吧,在对 NHibernate 了解了很多之后,我现在可以自己回答这个问题了:
ICriteria 查询返回由 NHibernate 获取的对象列表。 NHibernate 不知道返回了哪些对象,直到它们与一级缓存中的对象一一匹配。如果该项目已经在第一级缓存映射中,则丢弃从数据库读取的项目。如果它不在身份映射中,则将该项目放入一级缓存。

另一个“啊哈!”时刻:假设您第一次运行查询时数据库中有 5 行,所有行都被提取并放入一级缓存。现在随着时间的推移,表中又添加了 5 条记录,您可以重新运行查询。现在所有 10 条记录都已获取,但 NHibernate 看到其中 5 条记录已在缓存中,因此只会添加后面的 5 条记录。因此,基本上您无偿获取了 5 条记录(只是为了将标识符与身份映射中的对象标识符相匹配)。

关于nhibernate - NHibernate ICriteria 查询是缓存还是放在身份映射中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4829674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com