什么是延迟加载?
延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象
访问该对象的属性时才会加载出相应的值。简答来说就是尽可能的减少查询的数据量。
如何配置延迟加载在Hibernate中通过.hbm配置文件中的lazy属性来陪值,并且lazy属性出现的位置不同其作用和取值也不同。下面来详细介绍其在不同位置的不同取值和作用
类Class标签中的lazy:在类标签Class中出现的lazy取值有true(默认值 延迟加载)、false(立即加载)两种取值如下所示:
如果lazy取值为false则表示应用程序从数据库获取对象时会立即加载所有属性值(不包含自定义类型属性)
以员工表为例测试用例如下:员工表表结构:
员工实体类:
员工表的hbm映射文件:
测试代码:
测试结果:
从上图的结果中我们可以看到emp对象并没有进行延时加载但是其保存部门(Dept)对象的引用的属性并没有进行加载。
我们再来看看当lazy属性的值为true时的结果
从上图我们可以看到lazy的属性不管是True还是false其结果都是一样的!这是为什么呢?Lazy属性的值为true是不是应该延时加载吗?
注意:我们再上面编写测试用例时获取员工对象是用的get方法而我也在之前的博客中说过session对象的get方法不支持延时加载他会忽略掉类级别的lazy属性!我们把get方法换成load方法再来测试。
从上图中我们可以看到当lazy属性值为true时Hibernate并不会一次性加载出所有属性值,只有当程序需要时才去加载从而减少了和数据库交互的负担,提升了程序的性能,这也是延迟加载出现的目的!
多对一关联中的lazy如果想要在获取对象的同时立即加载与之关联的自定义类型属性就需要在其多对一配置中设置lazy属性,在此处lazy属性的取值为:proxy:延迟加载(默认值)、no-proxy:无代理延迟加载,false:立即加载
比如我们在实例一的基础上添加lazy属性值为false再来测试: