码迷,mamicode.com
首页 > Web开发 > 详细

见机行事【Nhibernate懒加载】

时间:2014-10-29 00:29:51      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:延迟加载   懒加载   

篇的文章中,我谈到了关联映射。关联映射旨在,在进行面向对象的查询时候,能够将与实体相关联的实体信息同时加载出来,避免了二次查询,提高了查询的便捷性,使得的面向的对象地操作能够更好覆盖SQL的功能。但这里不得不考虑一个问题:关联实体的加载,肯定是要占用程序资源的。关联实体信息的使用不是每时每刻都会使用,如果每次查询都对关联实体加载,肯定要浪费程序资源。这里采用了懒加载机制,很好的解决了这个问题。延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作,在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载。

在网上查阅了一下资料,延迟加载的具体细节如下:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"  
    namespace="Model" assembly="Model">  
  
  <class name="Dog" table="Dog" lazy="true">  
  	......  
    <many-to-one name="Master" column="MasterId" />  <!-- 这里多了这个标签,指明对应表中外键“MasterID”对应的是实体Master所对应表记录-->  
      
  </class>  
</hibernate-mapping>  

通过将class的lazy属性设置成true,来开启实体的延迟加载特性。如果运行下面的代码:

prince = (Dog)session.Load("Dog","dogid" );  //1处
  
     txtinformation.Text = "赤丸的主人是:"+prince.Master.Name; //查出dog对象的同时,其Master的信息也就查了出来。  //2处

当运行到1处时,Hibernate并没有发起对数据的查询,只是返回实体对象的代理类对象,这里所返回的对象类型就是Prince对象的代理类对象。在Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,我们可以看出此时真正的Prince对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中,当代码运行到(2)处时,此时调用prince.Master,这时通过CGLIB赋予的回调机制,实际上调用CGLIB$CALBACK_0.prince.Master,当调用时,Hibernate会首先检查CGLIB$CALBACK_0.target属性是否为null,如果不为空,则调用目标对象的prince.Master,如果为空,则会发起数据库查询,生成SQL语句;来查询数据,并构造目标对象,并且将它赋值到CGLIB$CALBACK_0.target属性中。    

这样,通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。

见机行事【Nhibernate懒加载】

标签:延迟加载   懒加载   

原文地址:http://blog.csdn.net/chenjinge7/article/details/40556777

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!