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

Pan*_*kaj 1 nhibernate lazy-loading

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

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

Mig*_*ing 11

延迟加载和预先加载是每个ORM中必须存在的概念.我们来看一个亲子关系:

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

class Child {
  String name;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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