这篇博文我们来看一下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:最后一点小建议,希望你在看博的同时,自己真正的敲一遍。有任何意见或问题请留言