您的位置:首页 > 其它

懒加载分析情况

2011-12-15 14:25 218 查看
延迟加载也称懒加载,他是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)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: