Hibernate懒加载策略

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值