[转]Hibernate中get与load的区别

1.搜索不到符合条件的记录,get返回一个null,load会抛出一个ObjectNotFountdException
  
  2.load返回实体的代理类实例(查看缓存和二级缓存);但get方法则要分情况:
  ●能get方法若在 session缓存中找到了该id对应的对象,如果在前一步中被代理过的,其中被load方法使用过或被其它关联对象延迟加载过,则返回的原来的代理对象;
  ●若该代理对象操作前没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。
  
  3.load方法充分利用内部缓存和二级缓存,get方法只使用内部缓存,没有就直接查询!所以,如果要利用二级缓存的时候,要用load读取数据。
  
  4、读取时机不同(当lazy=true的时候)
  load是采用延迟机制(load语句不读库,等使用非主键时才去读库),而get不采用延迟机制(get语句时马上读库);
  
  5、从检索执行机制上对比:
  get方法和find方法都是直接从数据库中检索
  而load方法的执行则比较复杂
  ● 首先查找session的persistent Context中是否有缓存,如果有则直接返回
  ●如果没有则判断是否是lazy,如果不是直接访问数据库检索,查到记录返回,查不到抛出异常
  ●如果是lazy则需要建立代理对象,对象的initialized属性为false,target属性为null
  ●在访问获得的代理对象的属性时,检索数据库,如果找到记录则把该记录的对象复制到代理对象的target上,并将initialized=true,如果找不到就抛出异常 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值