什么是hibernate懒加载?所谓懒加载(lazy)就是延时加载,延迟加载。
什么时候用懒加载呢?只能回答要用懒加载的时候就用懒加载。
为什么要用懒加载呢?就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。
首先说下子什么是延迟加载:
延迟加载是一种机制,主要是解决不必要的查询对资源的浪费,只有当数据真正调用时才加载,而不会对数据进行提前加载造成资源的浪费。
1,Hibernate延迟加载的看法:
延迟加载就是懒加载,使用懒加载是解决了负载问题,也就是说懒加载后不会立即去访问数据库,而是尽量延迟,延迟到用户执行数据库查询命令的时候或者使用initialize方法的时候去和数据库交互,这样就减轻了与数据库交互的压力,如果缓存中有数据的话会优先考虑缓存数据,总之是尽量避免和数据库的直接交互,但有些时候也会出现数据没有得到及时更新的错误数据,所以,在金融等方面的项目开发的时候尽量避免懒加载。比如在统计论坛数据访问量等要求不是很严格的情况并且数据量比较大的情况下可以使用懒加载。
【load】load方法会导致懒加载出现,如果要数据及时送入数据库的话,使用save方法时,load会延迟至强制访问数据库执行,比如get方法调用的时候。
【one to one映射】对于懒加载,一对一映射中的constrained属性设置为true的时候实现懒加载,lazy决定了什么时候进行懒加载,而fetch决定了抓取的方式。
【mang to one映射】对于多对一映射中,默认情况下是懒加载的,这样有利于减轻系统负载,如果要取消懒加载进行查询的话,在集合端中把lazy属性设置为false就可以。
【总结】懒加载是通过代理方式实现的,代理的对象在访问的时候才会去和数据库进行交互,前提是session没有被关掉的情况下。
比如部门PO和员工PO,部门与员工1对多,如果lazy设置为 false,那么只要加载了一个部门的po,就会根据一对多配置的关系把所有员工的po也加载出来。但是实际上有时候只是需要用到部门的信息,不需要用到员工的信息,这时员工po的加载就等于浪费资源。如果lazy设置为true,那么只有当你访问部门po的员工信息时候才回去加载员工的po的信息。
Hibernate 3.0中lazy有三个值:true,false,proxy,默认的是lazy="proxy"。
具体设置成什么要看业务的需求,并不是说哪个设置就是最好的,到低要怎样设置就要看你的实际需求了。