Hibernate3延迟加载(lazy loading)详细分析与解释

Hibernate3延迟加载(lazy loading)详细分析与解释

一.延迟加载定义:

延迟加载(lazy load)(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。可以简单理解为,只有在使用的时候,才会发出sql语句进行查询。

二.延迟加载的运行的方式:

1)集合类型的延迟加载:

    当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性里包含十万,甚至百万的记录,在初始化持久化实体的同时,完成所有集合属性的抓取,将导致性能急剧下降。完全有可能系统只需要使用持久化类集合属性中的部分记录,而完全不是集合属性的全部,这样,没有必要一次加载所有的集合属性。

对于集合属性,通常推荐使用延迟加载策略。所谓延迟加载就是等系统需要使用集合属性时才从数据库装载关联的数据。

下面我用用部门-员工两个关联类进行举例说明:

测试查询所有部门的时候我们进行比较:

当如图上lazy=true的时候结果如下:

lazy=false的时候结果如下:

通过上面的比较,我们查询主表部门表的时候,当把部门表内的员工集合的lazy属性设为true(延迟加载),所对应的员工表的sql语句并没有被加载,节省了服务器的开销,当把lazy属性设为false(及时加载),当查询主表dept的时候,由于及时加载,字表EMP表的所有属性也在服务器后台查询了一遍,给服务器的查询带来压力,影响查询速度。

(2)实体对象的增删改查:

 关联实体是多个实体时(包括一对多、多对多):此时关联实体将以集合的形式存在,Hibernate 将使用 PersistentSetPersistentListPersistentMapPersistentSortedMapPersistentSortedSet 等集合来管理延迟加载的实体。这就是前面所介绍的情形。

关联实体是单个实体时(包括一对一、多对一):当 Hibernate 加载某个实体时,延迟的关联实体将是一个动态生成代理对象。

我们还是通过部门表来举例说明,首先把实体对象的lazy属性改为true:

我们写一个测试的方法进行演示:

现在我们根据dept id获取所有的DEPTS,通过测试我们会发现当实体对象的lazy=true的时候,session.load()方法不会出来任何数据,只有当调用实体对象属性.getDname()的时候,对象才会被加载。

同理,当我们把实体对象的lazy=false的时候,当程序走到session.load()方法的时候,既已经加载所有的数据;

这就是实体对象延迟加载与及时加载的区别,只有在用到对象属性的时候才会家在实体类。

(3)属性延迟加载:

Hibernate3开始增加了通过property节点的lazy属性,为特定的属性指定延迟加载策略,以避免实体整体加载可能带来的性能浪费,尤其是像长文本之类的大字段

我们继续通过实例来讲解属性延迟加载的运行机制:

首先我们把属性的lazy=true设置成功:

写一个方法进行测试:

通过测试我们发现输出结果:

刚才我们加为lazy=true的字段没有随程序的加载而加载,只有当程序调用.getName()方法的时候才会被加载(如下图所示),提高了服务器运行效率,特别是大文本字段,可以省去服务器的资源,而提高运行速度度:

以上就是Hibernate三种运行机制的应用以及他们所给我们编程工作带来的好处;

总结:

Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值