见机行事【Nhibernate懒加载】

上一篇的文章中,我谈到了关联映射。关联映射旨在,在进行面向对象的查询时候,能够将与实体相关联的实体信息同时加载出来,避免了二次查询,提高了查询的便捷性,使得的面向的对象地操作能够更好覆盖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实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。

时间: 2024-10-12 18:43:18

见机行事【Nhibernate懒加载】的相关文章

关于Hibernate中立即加载和懒加载的区别

当1表与2表之间有OneToMany(类似)关系时候, 对于1表的实体类,设置FetchType=EAGER时(也就是立即加载),取1表数据,对应2表的数据都会跟着一起加载,优点不用进行二次查询. 缺点是严重影响数据查询时间,查询速度慢. FetchType=LAZY(也就是懒加载),此时查询时间大大缩短,缺点是查询表1的数据时,查询不到2表的数据. 不会主动取查询2表的数据.

深入懒加载

[javascript] view plain copy 懒加载(LazyLoad)一直是前端的优化方案之一.它的核心思想是:当用户想看页面某个区域时,再加载该区域的数据.这在一定程度上减轻了服务器端的压力,也加快了页面的呈现速度. 懒加载多用于图片,因为它属于流量的大头.最典型的懒加载实现方案是先将需要懒加载的图片的src隐藏掉,这样图片就不会下载,然后在图片需要呈现给用户时再加上src属性. 公司内部库的懒加载正是采用这种方案.它会遍历页面中所有的图片,将其src缓存起来后删除图片的src属

页面图片懒加载

一.页面滚动加载图片的理解 当一个网页含有大量的图片的时候,往往在打开页面的加载的很慢,如现在的大型电商.新闻.微博等,如果一下加载整个网页的所有图片,那会是一个缓慢的过程,要想快速的浏览网页,我们这时候就需要用到了在滚动或滑动页面的时候加载图片的方法.即图片懒加载!!! 二.实现懒加载的思路 当打开页面的时候,刚开始不给显示图片的位置放图片,等滚动或滑动到哪里的时候在获取图片.当然如果我们不给图片src中放图片,就会出现先找不到图片的提示,这样肯定是不行的. 所以我们在放图片的位置刚开始让一张

懒加载 lazy loading

懒加载:延迟加载,当程序启动时不加载资源,当程序需要这些资源时再去加载.需要的时候再加载的一种方式,能够减少内存的占用,效率高.其本质是重写get方法. 背景:由于ios内存有限,如果我们一次性将所有资源加载完毕将极大的消耗内存,降低程序运行效率.所以就要将一些比较大的资源,如音频,数据,图片等大资源进行懒加载,就需要                                             先判断是否存在,如果不存在再创建实例化. 1 @property (nonatomic,

懒加载(延迟加载)之后,在使用数据过程中容易出现的bug

在UI中,使用懒加载,也就是延迟加载来加载数据的时候,总是会面临几个问题? 如:1. >为什么先创建NSArray属性? 2. >为什么重写NSArray的get方法? 3.>为什么要判断是否为空? 4.>为什么下方代码"//1"这里不用NSString stringWithFormat: 而"//2"这里要使用? 5.>同时"//2"这里为什么使用的是%ld 来作为占位符? 这些问题不搞懂,懒加载就很难通透,  代

懒加载的坑

先说如下东东: 比如我们申明这个鬼 @property (nonatomic, strong) NSArray *mineModelArray; 那么 _mineModelArray self.mineModelArray 这两个获取数组的原理是不一样的,(好多人都没注意这个) 第一个是就简单粗暴直接获取这个数组 第二个是调用@property的get方法获取到的,因为这个get方法返回的就是当前数组的的类型即一个数组.大多数情况下两者一样的的. 但是:如果在懒加载里面就不要再用self.min

Angular-ui-router + oclazyload + requirejs实现资源随route懒加载

本文主要说明在用AngularJS开发web应用中如何实现lazyload,使用AngularJS需要在前端实现路由功能,本文就介绍利用此点实现前端资源的懒加载. 问题 目前大部分AngularJS的应用用requirJS组织模块,但是很多都没有使用lazyload功能,在app.js中启动时将全部依赖加载进来,在模块功能较少,前端资源少的情况下没问题.那么问题来了,依赖资源过多时怎么办? build时利用grunt-contrib-requirejs提取合并文件,减少http请求,但是存在问题

懒加载(延迟加载)

懒加载FatchType.LAZY也称为延迟加载,是Hibernate3关联关系对象默认的加载方式,所谓懒加载就是当在真正需要数据的时候,才真正执行数据加载操作.简单理解为,只有在使用的时候,才会发出sql语句进行查询.懒加载的有效期是在session打开的情况下,当session关闭后,会报异常.当调用load方法加载对象时,返回代理对象,等到真正用到对象的内容时才发出sql语句. 急加载FatchType.EAGER 也成为立即加载,时立即执行sql语句.在session没有关闭的之前,如果

hibernate中懒加载急加载的区别,get方法和load方的区别法

懒加载是hibernate中的关联关系对象的默认方式,懒加载也会先去查询对象然后获取对象的id, 当正真要对数据进行使用时才会正真写sql语句. 懒加载的有效加载期是在session打开的时候,所以在我们要使用到懒加载的时候必须要保持session的开启. 急加载就是直接用sql语句去访问数据库,但速度相对于懒加载更快. get()方法在执行时会立刻向数据库发出sql语句. load()方法和懒加载类似也是只有当真正使用该实体的属性时才会发出sql语句: 还有就是当数据库中查询不到东西时,方法会