Lazy的概念就是只有在真正使用对象时,才会去创建。对hibernate而言,就是真正加载时才发出加载Sql语句。 延迟加载机制是为了避免一些无谓的性能开销而提出来的。
1 . 即时加载 –get加载数据
使用get获取数据,会立即查找(缓存—数据库)
2 .延迟加载 懒加载 lazy—load,不会立即查找,当需要的时候才会查找,容易造成:LazyInitialaztionException异常:因为session被关闭,lazy的生命周期与session相同,lazy加载必须依赖于session一直开启。
3 .Load支持延迟加载,get不支持延迟加载。如果没有设置延迟加载,那么load也会立即加载对象,如下lazy配置,在hibernate3.x之后默认是true的,在以前版本是false的。如果false,那么get和load都会立即加载对象。但是class中的lazy只对普通属性的延迟加载有效,不包括集合和其他类属性。
class name="cn.siggy.pojo.Book" table="book" catalog="hibernate4" lazy="true">
4.lazy加载那么不会立即查找对象,会先返回代理,hibernate通过cjlib实现代理。
5.集合中的lazy
<!-- 默认是true-->
<set name="books" inverse="true" lazy="extra">
true/false/extra
如果设置为true,那么就会在该集合被加载时发出SQL语句(即需要集合的内容的时候)
如果设置为false,那么在发出查询普通属性sql时就会随后发出集合的查询语句。
如果设置为extra,与设置为true类似,但相对智能,建议在实际工作中选用extra.
lazy=true的。支持懒加载,但是当使用size()的时候依然要去查询整个set集合的内容。Lazy=false;立即查询所有集合的内容。Lazy=extra比较智能。支持懒加载,当使用size()的时候,不会查询整个集合,仅仅查询集合中元素的个数。当需要使用集合元素的内容时,再去查询集合内容。
举例 books表和category表 books有外键引用了书的分类表
set\list默认就是懒加载,这与get不矛盾,get指的是取对象的时候,这里用get的时候立马查询category的表但是不查询books,因为懒加载,要用到books的时候才查books,如果指定lazy=false,则马上查询两个表
6.单端关联上 就是在多的一端或者一的一端的懒加载的配置
One-to-one,many-to-one[单端关联]
proxy /false
如果设置为proxy,那么就会在类对象被加载时发出SQL语句。
如果设置为false,那么在发出查询普通属性sql时就会随后发出类对象的查询语句。
<many-to-one name="category" class="cn.siggy.pojo.Category"
cascade="save-update" lazy="proxy">
<column name="category_id" />
</many-to-one>