【hibernate】session中的load和get对比

引言

        凡是有相同点的知识,都要拿出来对比一下,对比着学习,收获多多哦~~~~

        Session的load和get方法都可以跟团聚指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。但是还是有区别的。


get()方法

        当调用session.get()时,首先在session缓存中查找,然后在二级缓存中查找,如果有就返回数据,没有的话直接查询数据库,数据库中如果没有就返回null,不会报错。


Load()方法

1)lazy=true

        当调用session.load()时,首先在session缓存中查找,然后在二级缓存中查找,如果查到对象,返回的是一个代理对象,如果后面没有使用查询结果,就不会像数据库发起查询。只有使用查询结果才会真正的向数据库发出查询,我们称之为懒加载(lazy)。XXX.hbm.xml文件中默认配置lazy=”true”。如果没有查到数据会抛出ObjectNotFoundException异常。


2)lazy=false

       若配置文件中lazy=”false”,那load()方法的查询顺序和get()方法一样,但是当没有查到数据的时候还是会发出ObjectNotFoundException异常。


Demo

1)get

User user =(User)session.get(User.class, 1);

        立即去执行数据库查询。 

        当没有查到数据的时候,返回null



2)load

//不会发出sql
	User user =(User)session.load(User.class, 1);


          不会立即执行数据库查询

 

//不会发出sql
	System.out.println("user.id="+user.getId());

  因为执行过load方法之后会在hibernate的一级缓存里放一个map对象,该map对象的key就是userId的值,所以当执行getId()时,就会去一级缓存里拿map的key值,而不去执行数据库查询,所以不报错,不执行数据库操作。

//会发出sql
	System.out.println("user.name="+ user.getName());

        缓存中没有,执行了数据库操作。

        当没有查到数据的时候,返回ObjectNotFoundException异常。



总结

           get()不支持懒加载,load支持懒加载!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值