对象的状态、一级缓存、懒加载
一、对象的状态
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!