【发布时间】:2010-11-04 20:23:25
【问题描述】:
lazy="true"和lazy="proxy"在nhibernate中有什么区别?
【问题讨论】:
标签: nhibernate proxy lazy-evaluation
lazy="true"和lazy="proxy"在nhibernate中有什么区别?
【问题讨论】:
标签: nhibernate proxy lazy-evaluation
我怀疑这是另一种思考方式。
class Foo
{
public virtual Bar SingleBar { get; set; }
public virtual ICollection<Bar> MultiBar { get; set; }
}
(您不能将lazy="proxy" 设置为集合,也不能将lazy="true" 设置为单个引用。两者都会导致NH 抛出XmlSchemaException,这对初学者来说有点神秘。)
在操作上,它们执行相同的抽象操作:当且仅当访问属性时,NHibernate 才会访问数据库并填充属性。
然而,由于获取对象所需的内容,实现中存在细微差别(在单一情况下,引用的 id (Bar) 与父实体 (Foo) 一起加载。在收集情况下,id 是未知,必须在另一个表中找到)
【讨论】:
lazy="proxy" 意味着 NHibernate 会延迟初始化你的类的实例; 当 NHibernate 从数据库中检索您的类的实例时,它将 - 在这种情况下 - 不会返回您的类的“真实”实例,而是会给您一个代理。也就是说,它将返回另一个类型的对象,更具体地说,是您的类的子类的对象(由 NHibernate 通过 IL 生成生成)。
您将获得的对象是一个代理,唯一填充的属性是 Id 属性。一旦您调用实例上的另一个属性,NHibernate 将初始化代理,并从数据库中检索所有其他属性/集合(延迟加载的除外)。
Lazy="true" 用于另一个级别。而lazy="proxy" 用于类级别,lazy="true" 用于集合级别。这意味着该集合应该是延迟加载的。
【讨论】:
documentation reference 表示代理属性的值在:
lazy="proxy|no-proxy|false"
lazy(可选 - 默认为代理):默认情况下,单点关联被代理。
lazy="no-proxy" 指定应在首次访问实例变量时延迟获取属性(需要构建时字节码检测)。
lazy="false" 指定总是急切地获取关联。
【讨论】:
默认情况下,Hibernate3 对集合使用惰性选择获取,对单值关联使用惰性代理获取。这些默认值对于大多数应用程序中的大多数关联都是有意义的。
http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-fetching-lazy
【讨论】: