【问题标题】:lazy-loading and Eagerly loading in NhibernateNhibernate 中的延迟加载和急切加载
【发布时间】:2010-02-12 10:16:31
【问题描述】:

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

请用简单的词定义我的延迟加载和急切加载。 还有为什么我们使用 castle.Dynamic Proxy ?

【问题讨论】:

    标签: nhibernate lazy-loading


    【解决方案1】:

    延迟加载和急切加载是每个 ORM 中必须存在的概念。 让我们来看看父子关系:

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

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

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

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

    【讨论】:

      【解决方案2】:

      延迟加载 = 等待代码显式访问属性/集合,然后再从数据库加载它。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多