【发布时间】:2010-02-12 10:16:31
【问题描述】:
我正在使用 Nhibernate,但由于对 Nhibernate 的了解不足,我仍然对(延迟加载和急切加载)这两个主题感到困惑。
请用简单的词定义我的延迟加载和急切加载。 还有为什么我们使用 castle.Dynamic Proxy ?
【问题讨论】:
我正在使用 Nhibernate,但由于对 Nhibernate 的了解不足,我仍然对(延迟加载和急切加载)这两个主题感到困惑。
请用简单的词定义我的延迟加载和急切加载。 还有为什么我们使用 castle.Dynamic Proxy ?
【问题讨论】:
延迟加载和急切加载是每个 ORM 中必须存在的概念。 让我们来看看父子关系:
class Parent {
String name;
List<Child> childs;
}
class Child {
String name;
}
当您加载 Parent 的一个元素时,ORM 必须决定它是否也加载子集合(例如通过连接),或者是否延迟查询以加载子集合,直到您实际访问该集合
parent.childs.get(0)
如果要在访问集合时触发检索子集合的查询,则需要对子集合进行某种回调/拦截。这是通过集合上的代理完成的,因此您可以拦截对集合的每次访问以从数据库中获取数据。这就是为什么您需要像 Castle 这样的代理/拦截库。
【讨论】:
延迟加载 = 等待代码显式访问属性/集合,然后再从数据库加载它。
急切加载 = 提前主动加载该数据,无论代码是否使用过。
代理用于拦截对所述属性/集合的访问以发起负载。
【讨论】: