延迟加载也称懒加载,他是Hibernate为提高执行效率而提供的一种机制,即只有真正使用该对象的数据是才会创建。
Hibernate中主要是通过代理(proxy)机制来实现延迟加载的。它的具体过程是Hibernate从数据库获取某一个对象的数据时,获取某一个对象的集合属性值时,或获取某一个所关联的另一个对象时,由于没有使用该对象的数据(除标示符值外),hibernate并不从数据库加载真正的数据,而只是为该对象创建一个代理,对象来代表这个对象,这个对象上的所有属性都为默认值;只有在真正需要使用该对象的数据是才创建这个真是对象,真正从数据库中加载他的数据。这样在某些情况下,就可以提高插叙效率。
一、分析各种延迟加载策略的异同点
当没有关联关系的时候,lazy属性应该设置在class标签内,取值为true和false
true:系统默认,它表示支持懒加载功能,并创建代理对象等操作。在调用其对象属性的时候,才去查询数据库,并必须在session关闭之前
false:表示取消懒加载功能,当执行load方法的时候,直接就去数据库中查询并返回,与get()一样
当在关联关系中lazy则有三个属性 proxy no-proxy false
proxy:当前对象的単值相关对象只有在调用它的主键外的其他属性的get方法时才加载它。
no-proxy:当前对象的単值相关对象只有在调用它的属性时才加载,需要字节码增强。
false:表示取消懒加载功能。
二、鉴别各种抓取策略的异同点,利用fetch属性来设置抓取策略取值分别为:
select 表示二次select语句查询
join 表示连接查询。如果加上,则懒加载不起作用,直接将两表连接查询。
三、分析各种出现的情况系统采用处理方式:
在映射文件中,用<set>元素来配置一对多关联关系。<set>元素有lazy和fetch属性
Lazy:主要决定orders集合被初始化的时机。即到底是在加载Customer对象时就被初始化,还是在程序访问orders集合时被初始化。
Fetch:取值为“select”或“subselect”时,决定初始化orders的查询语句的形式;获取值为“join”,则决定orders集合被初始化 的时机。
若把fetch设置为“join”,lazy属性将被忽略
fetch (默认值select) | Lazy (默认值是true) | 策略 |
Join | False | 采用迫切左外联接检索。 |
Join | True | 采用迫切左外联接检索。 |
join | Extra | 采用迫切左外联接检索。 |
select | False | 采用立即检索 |
select | True | 采用延迟检索 |
select | Extra | 采用延迟检索 c.getOrders().size() 执行 select count(id) from orders where customer_id =? for(Order o:set){ o.getOrderNumber();} 将执行: select customer_id , id,order_number ,price from orders where customer_id=? |
subselect | false/true/extra 也分为3中情况 | 嵌套子查询(检索多个customer对象时) Lazy属性决定检索策略) select customer_id,order_number,price from orders where customer_id in (select id from customers) |