hibernate中的延迟加载(lazyload)分属性的延迟加载和关系的延迟加载
属性的延迟加载:
当使用load的方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进行查询。否则不会访问数据库
Load的加载方式:
1、Load采用延迟加载的方式,hibernate的思想是既然这个方法支持延迟加载,它就认为这个对象一定在数据库中存在,可以放心的使用代理来延迟加载,如果在使用过程中出现了问题就放心的抛异常
2、Load方法会首先查询session缓存,看缓存中有没有这个对象
3、如果缓存中没有这个对象就会去创建个代理对象来管理,因为延迟加载需要代理来执行。但是并没有去数据库中查询
4、只有当你实际使用这个对象的时候,它才会触发sql语句。这个时候hibernate就会去查询二级缓存和数据库,如果数据库中没有这条语句,就抛出异常ObjectNotFoundException。
hibernate load方法加载实体对象的时候,会根据映射文件上 类级别 lazy属性值的配置,分情况讨论:
(1)若为true,即为延迟加载,就是上面的模式
(2)若为false,即为非延迟加载,即立即加载。就跟get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
关系的延迟加载:
one-many many-many的时候都可以使用关系的延迟加载
元素中的lazy属性的可选值为:true(延迟加载),extra(增强延迟加载)和false(立即加载);
元素中的lazy属性的默认值为true
extra其实是一种比较智能的延迟加载,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据。
hibernate在对象关系映射文件中配置加载策略的方式:(lazy)
1、类级别
元素中lazy属性的可选值为true(延迟加载)和false(立即加载);
元素中的lazy属性的默认值为true
2、一对多关联级别:
元素中的lazy属性的可选值为:true(延迟加载),extra(增强延迟加载)和false(立即加载);
元素中的lazy属性的默认值为true
extra其实是一种比较智能的延迟加载,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据。
3、多对一关联级别:
元素中lazy属性的可选值为:proxy(延迟加载),no-proxy(无代理延迟加载)和false(立即加载)
元素中的lazy属性的默认值为proxy
来源:https://www.cnblogs.com/crazy-lc/p/12193357.html