hibernate加载策略session.load()与session.get()---【小白系列】0基础到熟练应用hibernate框架(五)

  这篇博文我们来看一下session.load查询方式的两种加载策略有何不同

加载策略:

                  根据配置策略决定何时执行sql语句

演示及详解:

我们打开映射文件(customer.hbm.xml)来看一下


可以看到lazy属性设置了true,那么加载策略翻译过来就是  懒加载吗?="是的"

我们到代码里对比一下session.get()和session.load()

session.load()---lazy="true"


详解该代理对象

代理对象

               改变一个类原有的功能属性


从这张图我们可以看到,该代理对象增加了一个handler属性,并且原属性全部为空

接下来我们来看看这个handler


分析红框内容

可见handler封装了如下内容

1.entityName:查询哪个实体?Customer

2.id:实体id

3.initialized:初始化了吗?false

4.session:查询时所用的session

懒加载原理:

由此不难看出,当我们程序运行到

System.out.println("load:"+loadCustomer);
访问这个loadCustomer对象时,会先去判断这个对象是否初始化

initialized属性为false

说明该对象还没有进行查询,那么将会

1.根据session和id去查询

2.为实体赋值

3.将initialized标记改为true

结论:

当我们使用懒加载时,要注意查询出来的实体只是一个代理对象,等我们使用待查询对象时,才会触发sql去查询

懒加载注意事项:

1.代理对象未初始化关闭session,再次初始化时会抛出异常
代码演示及详解:

这里我们先关闭session 在进行打印,可以看到报了 不能初始化代理对象 no Session 的异常 
2.查询时要保证查询id在数据库中一定存在,否则报异常
这里我们为了引起异常 查询一条数据库不存在的id=99的数据


按照我们的想法,既然查不到你返回null就可以了啊,为什么这么粗鲁的 异常?
这是因为hibernate觉得你在戏弄他!没错,你使用了懒加载,又是load方法,那么数据库一定有id=99的数据,
如果我们使用get方法,则返回null
注意:
如果我们查询是为了判断对象是否存在那我们使用session.get()方法!

session.get()

案例代码及讲解:



那get()方法我就用一句话总结吧,你让我去查,那么我就去给你查,查出来就给实体赋值,查不到就返回null

ps:最后一点小建议,希望你在看博的同时,自己真正的敲一遍。有任何意见或问题请留言
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LawsonJin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值