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

来源:互联网 发布:js drag拖拽 编辑:程序博客网 时间:2024/05/16 14:52

  这篇博文我们来看一下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
原创粉丝点击