Hibernate中的lazy属性

lazy策略可以用在:
* <class>标签上:可以取值true/false
* <property>标签上,可以取值true/false,这个特性需要类增强
* <set>/<list>等集合上,可以取值为true/false/extra
* <one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy

代理的概念:只有真正使用的时候才会创建。对于hibernate而言,真正使用时候才会发出sql。

重要的概念:
1、lazy的概念,指在需要的时候才发出sql
2、lazy策略只是在session打开期间才是有效的

注意:
Hibernate类级别的lazy加载策略:可以控制什么时候加载这些普通对象属。

例如,我们有一个类Student:

public class Student{

private int id;

private String name;

private float score;

//get、set省略...

}

用hibernate进行加载id为1的对象并打印:

Student stu = (Student)session.load(Student.class,1);//……(1)

System.out.println("stu.name="+stu.getName());//……(4)

System.out.println("stu.score="+stu.getScore());//……(5)

……

测试一:

如果在配置文件中设置Student的加载方式是lazy="false",那么在执行完(1)之后就会立即发出SQL加载对象,往后对stu进行所有的get操作都不会再发SQL(这里是针对普通属性而言,即在映射文件中以"property"标签映射的那些属性)。

测试二:

如果在配置文件中设置Student的加载方式是lazy="true",那么在执行完(1)之后就会不会立即发 出SQL加载对象,而在执行(4)的时候才发出SQL。同样,往后对stu进行所有的get操作都不会再发SQL(这里是针对普通属性而言,即在映射文件中以"property"标签 映射的那些属性)。

测试三:

如果在(1)(4)之间添加一句:

session.close();//……(2)

那么可以发现:

如果采用lazy=true,则会抛出异常,一条SQL都没有发出,什么都加载不到。

如果采用lazy=false,则会发出SQL语句,加载对象到一级缓存中,get操作正常被打印出来。

测试四:

在测试三的基础上,在(2)后面加入一句:

session.clear()//……(3)

那么可以发现,本来之前采用lazy=false是可以发出SQL语句,而且也可以使用get操作的,但现在却是发出SQL语句,get操作不行了。说明此时对象仍然能从数据库中加载到一级缓存,但情空一级缓存后,就不能够操作这些对象了。


Hibernate集合属性的懒加载策略:

在集合属性上,可以配置懒加载策略,取值为:true/false/extra

true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据
false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据


Hibernate单端关联懒加载策略:即在<one-to-one>/<many-to-one>标签上可以配置
懒加载策略。

可以取值为:false/proxy/no-proxy
false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象
proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候
才真正发出查询语句查询其对象数据,其关联对象是代理类
no-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类

注意:在class标签上配置的lazy属性不会影响到关联对象!!!
<class name="com.bjsxt.hibernate.Classes" table="t_classes" lazy= *"false"> 这个实验证明class上的lazy属性影响的是普通属性,设为false,对普通属性为立刻发出sql语句, *而对于集合等非普通属性则不会发出sql。

另外,一般人确实只知道lazy是用来控制延迟加载和立即加载的,而没有去考虑为什么要这么用。Hbernate3.0中lazy有三个值,true,false,proxy,默认的是lazy="proxy"。具体设置成什么要看你的需求,并不是说哪个设置就是最好的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值