在 Nhibernate 中加载与获取

Posted

技术标签:

【中文标题】在 Nhibernate 中加载与获取【英文标题】:Load vs Get in Nhibernate 【发布时间】:2010-04-04 17:33:33 【问题描述】:

我的 Web 应用程序中的母版页使用 Get 进行身份验证并加载用户实体。

在此之后,每当用户控件或任何其他类需要用户对象时,我都会执行Load

通常nhibernate is supposed to load the object from cache or return the persistent loaded object 每当Load 被调用。但这不是我的 Web 应用程序显示的行为。 NHprof 总是在调用 Load 时显示 sql。如何验证Load 的正确行为?

我使用 S#arp 架构 框架。

【问题讨论】:

【参考方案1】:

实际上,对未标记为惰性的实体调用 Load 会立即加载。那是因为非惰性实体永远不会被代理。在这种情况下,它的作用与 Get 相同。

【讨论】:

【参考方案2】:

如果您使用 Get,则会对数据库进行命中。 如果您使用加载,则不会对数据库产生任何影响,但对象(在您的情况下为用户)是使用“延迟加载”创建的。因此,当您检查一个属性时,它知道您需要数据,因此它会通过查询访问数据库以获取数据。

如果你想从缓存中获取一个对象,你需要考虑 2 个选项。 一级缓存,是在一个会话中使用的缓存。因此,当您关闭会话或在不同的会话中加载相同的对象时,您会获得额外的命中。 二级缓存适用于所有会话。如果一个会话获取对象,则另一个会话从缓存中获取它。

所以你想要的可能是二级缓存。

【讨论】:

以上是关于在 Nhibernate 中加载与获取的主要内容,如果未能解决你的问题,请参考以下文章

NHIbernate 和安全/业务层

Abp.NHibernate连接PostgreSQl数据库

Nhibernate学习教程-- 开篇有益

使用 NHibernate 的示例查询

如果我使用类似 NHibernate 的 ORM,为啥需要 LINQ?

Swift - 根据数组值从 Parse 表中加载