在Nhibernate中延迟加载和急切加载

时间:2010-02-12 10:16:31

标签: nhibernate lazy-loading

我正在使用Nhibernate,但由于对Nhibernate的理解不足,我仍然对这两个主题感到困惑(延迟加载和急切加载)。

请定义我的延迟加载和热切加载简单的单词。 为什么我们使用castle.Dynamic代理?

2 个答案:

答案 0 :(得分:11)

延迟加载和预先加载是每个ORM中必须存在的概念。 让我们采取亲子关系:

class Parent {
  String name;
  List<Child> childs;
}

class Child {
  String name;
}

当您加载Parent的元素时,ORM必须决定它是否也加载子集合(例如通过连接),或者它是否延迟查询以加载子集直到您实际访问集合

parent.childs.get(0)
  • 当您提前加载子集合时,即在访问集合之前,它正急切地加载,因为您希望访问子节点。这可以在单个查询中完成,但缺点是从数据库中提取更多数据。
  • 当您延迟加载直到访问实际集合时,它被称为延迟加载,因为您只在严格要求时才获取子项。这样做的好处是只需要在需要时获取数据,但需要额外的查询(例如,对于这个主题你可以查询google的“N + 1 select hibernate”)。

如果要在访问集合时触发查询以检索子节点,则需要对子集合进行某种回调/拦截。这是通过集合上的代理完成的,因此您可以拦截对集合的每次访问以从db获取数据。这就是为什么你需要一个代理/拦截库,比如Castle。

答案 1 :(得分:4)

延迟加载=等待代码在从数据库加载之前显式访问属性/集合。

急切加载=提前主动加载该数据,无论代码是否曾使用过它。

代理用于拦截对所述属性/集合的访问,以便激发负载。