get、load与懒加载小总结

一、get()与load()

1、 是否支持懒加载

Load支持懒加载,get不支持懒加载

2、 加载时机不同

Load采用延迟加载,等到使用非主键时才去读库

Get马上读库

3、 搜素不到数据时的情况

当搜素的数据不存在时,load会返回一个对象,在使用该对象的非主键属性时会抛出一个ObjectNotFoundException。 

当搜素的数据不存在时,get会返回null;

 

【为什么只有在使用该对象的非主键属性时才会抛异常?

Users user = (Users)session.load(Users.class, userId);  

System.out.println(user.getId());  

上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。

 

get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

 

注意:get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用 过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数 据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据

 

二、lazy的概念和策略

Lazy的概念:

只有在真正使用该对象时,才会创建,对hibernate而言,真正使用的时候才会发出

Hibernate支持lazy只有在session打开的状态下才有效

在<class>上lazy为true时,load不发出sql语句,只有使用时才发出;为false时在第一次load时就执行全部sql语句;为extra时和true差不多,不过发出的sql语句比较智能【集合标签上面的lazy特性推荐使用extra】

 

Hibernate lazy策略的可以使用在:

1、<class>标签,取值可以为true、false【只对普通属性起作用,不会影响集合和单端上面的lazy属性】

2、<property>标签上,取值可以为true、false(需要增强类)

3、<set><list>上的取值可以为false、true和extra

4、<one-to-one>、<many-to-one>单端关联上,取值可以为false/true/noproxy

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值