对象的状态、一级缓存、懒加载

一、对象的状态

Hibernate中对象的状态:临时/瞬时状态、持久化状态、游离状态。
1.临时状态特点

直接new出来的对象;
不处于session的管理;
数据库中没有对象的记录。

2.持久化状态

当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态。处于持久化状态的对象,当对对象属性进行更改的时候,会反映到数据库中!

持久化状态的特点

处于session的管理;
数据库中有对应的记录。

3.游离状态的特点

不处于session的管理;
数据库中有对应的记录;
session关闭后,对象的状态。

二、一级缓存

1.为什么要用缓存?

目的:减少对数据库的访问次数,从而提升hibernate的执行效率。

2.Hibernate中缓存的分类

一级缓存
二级缓存

3.概念

1.Hibernate中一级缓存,也叫session的缓存,它可以在session范围内减少数据库的访问次数!只在session范围有效!session关闭,一级缓存失效!
2.当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。
3.session的缓存由hibernate维护,用户不能操作缓存内容;如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。

4.特点

只在(当前)session范围有效,作用时间短,效果不是特别明显!
在短时间内多次操作数据库,效果比较明显!

5.缓存相关几个方法的作用

session.flush(); 让一级缓存与数据库同步
session.evict(arg0); 清空一级缓存中指定的对象
session.clear(); 清空一级缓存中缓存的所有对象
在什么情况下用上面方法?
批量操作时候使用:
session.flush(); //先与数据库同步
session.clear();//再清空一级缓存内容

6.面试题1.不同的session是否会共享缓存数据?

不同的session使用不同的缓存区,不能共享

7.面试题2.list与iterator查询的区别?

list()一次把所有的记录都查询出来,iterator()会有一个N+1查询;N表示所有的记录总数,即会先发送一条语句查询所有记录的主键(1),再根据每一个主键再去数据库查询(N)!
list()会放入缓存但不会从缓存中取;iterator()会放入缓存也会从缓存中取。

三、懒加载

1.面试题3. get、load方法区别?

get是及时加载,只要调用get方法立刻向数据库查询。
load默认使用懒加载,即在使用数据的时候,才向数据库发送查询的sql语句。

2.懒加载(lazy)

概念:当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性。
目的:提高程序执行效率。

3. lazy值

true:使用懒加载
false:关闭懒加载
extra:(在集合数据懒加载时候提升效率)在真正使用数据的时候才向数据库发送查询的sql;如果调用集合的size/isEmpty方法只是统计,并不查所有数据。

4. 懒加载异常

session关闭后,不能使用懒加载数据!
如果session关闭后,使用懒加载数据报错!

如何解决session关闭后不能使用懒加载数据的问题?

方式一、先使用数据
方式二、强迫代理对象初始化:Hibernate.initialize(proxy)
方式三、关闭懒加载,设置lazy=false
方式四、在使用数据之后再关闭session!

posted @ 2016-05-27 09:38  yly123  阅读(280)  评论(0编辑  收藏  举报