Hibernate中get和load方法

在Hibernate中,get和load方法都是根据主键查询数据,但是二者又不尽相同,在这里做一下对比学习。

共同点:

1、二者都是根据主键查询数据

2、加载出来的数据都是持久化状态的

不同点:

1、执行时间

get方法是对应参数的类的对象。get方法一使用,Hibernate立马就发出SQL语句去查询数据库里面的内容。 load方法获得的是对应参数的类的代理对象,如果你没有对其调用里面的方法等等,Hibernate是不会发出SQL语句去查询数据库里面的内容。

2、返回结果

这意味着,会出现,当数据库中没有对应Id的数据存在时,get方法是返回null值,如果使用load方法,因为一开始是获得代理对象,所以并非null值,这样不能知道数据库里有没有该数据的存在,只有当你使用该代理对象的时候,Hibernate才发出SQL语句,这时如果数据库没有该数据,系统就会报ObjectNotFoundException异常。还有,当调用完了相应的方法时关闭了Session,get方法没有影响,而load方法会出现异常。

3、执行机制

get方法和find方法都是直接从数据库中检索,而load方法的执行则比较复杂。首先查找session的persistent Context中是否有缓存,如果有则直接返回如果没有则判断是否是lazy,如果不是直接访问数据库检索,查到记录返回,查不到抛出异常;如果是lazy则需要建立代理对象,对象的initialized属性为false,target属性为null在访问获得的代理对象的属性时,检索数据库,如果找到记录则把该记录的对象复制到代理对象的target上,并将initialized=true,如果找不到就抛出异常。 

4、

如果使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常。所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时(注意:这就是由于“延迟加载”在作怪)。

由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。

对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。

总结:

hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。因为load默认支持懒加载,而get不支持,从效率方面来考虑的话,使用load是比较合适的,但是假如数据库中没有要查询的数据就会抛异常,这个就需要try   catch来捕获异常进行处理。




评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值