nhibernate延迟加载选项

时间:2009-06-22 12:45:45

标签: nhibernate proxy lazy-evaluation

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

4 个答案:

答案 0 :(得分:23)

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

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,这对初学者来说有点神秘。)< / p>

在操作上他们做同样抽象的事情:当且仅当访问属性时,NHibernate才会访问数据库并填充属性。

然而,由于获取对象所需的内容,实现方式略有不同(在单一情况下,引用的id(Bar)是使用父实体(Foo)加载的。在集合的情况下,id是未知,必须在另一张表中找到)

答案 1 :(得分:17)

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

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

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

答案 2 :(得分:9)

documentation reference表示代理属性的值位于:

lazy="proxy|no-proxy|false"
  

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

     

lazy =“no-proxy”指定在首次访问实例变量时应该懒惰地获取属性(需要构建时字节码检测)。

     

lazy =“false”指定始终紧急提取关联。

答案 3 :(得分:2)

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

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