nhibernate中lazy="true"
和lazy="proxy"
之间有什么区别?
答案 0 :(得分:23)
我怀疑另一种思考方式就是这样。
class Foo
{
public virtual Bar SingleBar { get; set; }
public virtual ICollection<Bar> MultiBar { get; set; }
}
(你不能将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