Hibernate中对象状态以及一级缓存(session的缓存)

来源:互联网 发布:天天酷跑解封软件 编辑:程序博客网 时间:2024/05/20 11:23

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

1)临时状态特点: 
a)直接new出来的对象。 
b)不处于session的管理 
c)数据库中没有对象的记录。

2)持久化状态特点: 
a)当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态。 
b)处于持久化状态的对象,当对对象属性进行更改的时候,会反映到数据库中! 
特点总结:处于session的管理;数据库中有对应的记录。

3)游离状态特点: 
a)不处于session的管理; 
b)数据库中有对应的记录 
c)Session关闭后,对象的状态;

2、注意:对象状态的转换! 
1)临时状态: 

2)持久化状态: 

3)游离状态: 

二、一级缓存 
1、为什么要用缓存? 
目的:减少对数据库的访问次数!从而提升hibernate的执行效率!

2、Hibernate中缓存分类: 
1)一级缓存 
2)二级缓存

3、概念 
1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效! 
2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。 

3)Session的缓存由hibernate维护, 用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。

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

5、缓存相关几个方法的作用 
1)session.flush(); 让一级缓存与数据库同步 
a)不适用flush(): 

b)使用flush() 

2)session.evict(arg0); 清空一级缓存中指定的对象 
3)session.clear(); 清空一级缓存中缓存的所有对象 

4)在什么情况用上面方法? 
批量操作使用使用: 
Session.flush(); 先与数据库同步 
Session.clear(); 再清空一级缓存内容

不同的session是否会共享缓存数据?

不会。


 

如果生成2update sql, 说明不同的session使用不同的缓存区,不能共享。


 

 list与iterator查询的区别?

list()

一次把所有的记录都查询出来,

会放入缓存,但不会从缓存中获取数据

Iterator

N+1查询;N表示所有的记录总数

即会先发送一条语句查询所有记录的主键(1),

再根据每一个主键再去数据库查询(N)!

会放入缓存,也会从缓存中取数据!


 


两次执行list 与iterator操作。






前半部分转载自:http://blog.csdn.net/qq_34944851/article/details/53781222