【问题标题】:nhibernate lazy load optionsnhibernate 延迟加载选项
【发布时间】:2010-11-04 20:23:25
【问题描述】:

lazy="true"lazy="proxy"在nhibernate中有什么区别?

【问题讨论】:

    标签: nhibernate proxy lazy-evaluation


    【解决方案1】:

    我怀疑这是另一种思考方式。

    class Foo
    {
       public virtual Bar SingleBar { get; set; }
       public virtual ICollection<Bar> MultiBar { get; set; }
    }
    
    • lazy="proxy" 适用于单个对象(即 foo.SingleBar)
    • lazy="true" 适用于对象集合(即 foo.MultiBar)

    (您不能将lazy="proxy" 设置为集合,也不能将lazy="true" 设置为单个引用。两者都会导致NH 抛出XmlSchemaException,这对初学者来说有点神秘。)

    在操作上,它们执行相同的抽象操作:当且仅当访问属性时,NHibernate 才会访问数据库并填充属性。

    然而,由于获取对象所需的内容,实现中存在细微差别(在单一情况下,引用的 id (Bar) 与父实体 (Foo) 一起加载。在收集情况下,id 是未知,必须在另一个表中找到)

    【讨论】:

    • 在我工作的应用程序中,“代理”和“真实”之间存在差异。如果外键具有关联表中不存在的值,lazy="true" 在 Linq 查询期间抛出 ObjectNotFoundException,而lazy="proxy" 按预期工作。
    【解决方案2】:

    lazy="proxy" 意味着 NHibernate 会延迟初始化你的类的实例; 当 NHibernate 从数据库中检索您的类的实例时,它将 - 在这种情况下 - 不会返回您的类的“真实”实例,而是会给您一个代理。也就是说,它将返回另一个类型的对象,更具体地说,是您的类的子类的对象(由 NHibernate 通过 IL 生成生成)。

    您将获得的对象是一个代理,唯一填充的属性是 Id 属性。一旦您调用实例上的另一个属性,NHibernate 将初始化代理,并从数据库中检索所有其他属性/集合(延迟加载的除外)。

    Lazy="true" 用于另一个级别。而lazy="proxy" 用于类级别,lazy="true" 用于集合级别。这意味着该集合应该是延迟加载的。

    【讨论】:

    • 那和lazy="true"有什么区别呢?
    • 您似乎没有回答问题。
    【解决方案3】:

    documentation reference 表示代理属性的值在:

    lazy="proxy|no-proxy|false"
    

    lazy(可选 - 默认为代理):默认情况下,单点关联被代理。

    lazy="no-proxy" 指定应在首次访问实例变量时延迟获取属性(需要构建时字节码检测)。

    lazy="false" 指定总是急切地获取关联。

    【讨论】:

    • Shouldn't lazy="proxy" 指定第一次访问实例变量时应该延迟获取属性
    • 更多信息可以在ayende的博客上找到:ayende.com/Blog/archive/2010/01/28/…
    • 我刚刚重新格式化,所以选项在不同的行上。
    • 链接腐烂已设置为这个答案
    【解决方案4】:

    默认情况下,Hibernate3 对集合使用惰性选择获取,对单值关联使用惰性代理获取。这些默认值对于大多数应用程序中的大多数关联都是有意义的。

    http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-fetching-lazy

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多