hibernate&三种状态的对象&一级缓存&快照机制

持久化类概述

1. Hibernate的持久化类
持久化类:Java类与数据库的某个表建立了映射关系.这个类就称为是持久化类.
持久化类 = Java类 + hbm的配置文件



持久化对象的三种状态

Hibernate的持久化类的状态
Hibernate为了管理持久化类:将持久化类分成了三个状态


瞬时态:Transient  Object
没有持久化标识OID, 没有被纳入到Session对象的管理.

持久态:Persistent Object
有持久化标识OID,已经被纳入到Session对象的管理.

脱管态:Detached Object
有持久化标识OID,没有被纳入到Session对象的管理.


## 持久化类概述 ## 1. Hibernate的持久化类  持久化类:Java类与数据库的某个表建立了映射关系.这个类就称为是持久化类.  持久化类 = Java类 + hbm的配置文件    ## 持久化对象的三种状态 ## Hibernate的持久化类的状态 Hibernate为了管理持久化类:将持久化类分成了三个状态  瞬时态:`Transient  Object`   没有持久化标识OID, 没有被纳入到Session对象的管理.     持久态:`Persistent Object`   有持久化标识OID,已经被纳入到Session对象的管理.     脱管态:`Detached Object`   有持久化标识OID,没有被纳入到Session对象的管理.  ![持久化对象的三种状态 ][1] ## Hibernate持久化对象的状态的转换 ##  - `瞬时态-- 没有持久化标识OID, 没有被纳入到Session对象的管理`  获得瞬时态的对象   User user = new User()  瞬时态对象转换持久态   save()/saveOrUpdate();  瞬时态对象转换成脱管态   user.setId(1)   - `持久态-- 有持久化标识OID,已经被纳入到Session对象的管理`  获得持久态的对象   get()/load();  持久态转换成瞬时态对象   delete();  --- 比较有争议的,进入特殊的状态(删除态:Hibernate中不建议使用的)  持久态对象转成脱管态对象   session的close()/evict()/clear();   - `脱管态-- 有持久化标识OID,没有被纳入到Session对象的管理`  获得托管态对象:不建议直接获得脱管态的对象.   User user = new User();   user.setId(1);  脱管态对象转换成持久态对象   update();/saveOrUpdate()/lock();  脱管态对象转换成瞬时态对象   user.setId(null);   - `注意:持久态对象有自动更新数据库的能力!!!`  ![Hibernate持久化对象的状态的转换][2]  代码演示: 持久态对象有自动更新数据库的能力  ![持久态对象有自动更新数据库的能力][3]  ## Session对象的一级缓存 ## 1. 什么是缓存?  其实就是一块内存空间,将数据源(数据库或者文件)中的数据存放到缓存中.再次获取的时候 ,直接从缓存中获取.可以提升程序的性能!   2. Hibernate框架提供了两种缓存  一级缓存 -- 自带的不可卸载的.一级缓存的生命周期与session一致.一级缓存称为session级别的缓存.  二级缓存 -- 默认没有开启,需要手动配置才可以使用的.二级缓存可以在多个session中共享数据,二级缓存称为是sessionFactory级别的缓存.   3. Session对象的缓存概述  Session接口中,有一系列的java的集合,这些java集合构成了Session级别的缓存(一级缓存).将对象存入到一级缓存中,session没有结束生命周期,那么对象在session中存放着  内存中包含Session实例 --> Session的缓存(一些集合) --> 集合中包含的是缓存对象!   4. 证明一级缓存的存在,编写查询的代码即可证明  在同一个Session对象中两次查询,可以证明使用了缓存   5. Hibernate框架是如何做到数据发生变化时进行同步操作的呢?  使用get方法查询User对象  然后设置User对象的一个属性,注意:没有做update操作。发现,数据库中的记录也改变了。  利用快照机制来完成的(SnapShot)  测试一级缓存: ![一级缓存][4]  ## 控制Session的一级缓存 ## 学习Session接口中与一级缓存相关的方法  Session.clear()   -- 清空缓存。  Session.evict(Object entity) -- 从一级缓存中清除指定的实体对象。  Session.flush()   -- 刷出缓存(原本是提交事务才缓存比较快照,flush刷新会提前比较)  ## 快照机制 ## ![快照机制][5]     [1]: http://www.suyibk.top/usr/uploads/2018/04/1565016060.jpg   [2]: http://www.suyibk.top/usr/uploads/2018/04/2012776169.png   [3]: http://www.suyibk.top/usr/uploads/2018/04/1672921047.png   [4]: http://www.suyibk.top/usr/uploads/2018/04/1672921047.png   [5]: http://www.suyibk.top/usr/uploads/2018/04/181361271.png

Hibernate持久化对象的状态的转换

 - 瞬时态-- 没有持久化标识OID, 没有被纳入到Session对象的管理
获得瞬时态的对象
User user = new User()
瞬时态对象转换持久态
save()/saveOrUpdate();
瞬时态对象转换成脱管态
user.setId(1)
 - 持久态-- 有持久化标识OID,已经被纳入到Session对象的管理
获得持久态的对象
get()/load();
持久态转换成瞬时态对象
delete();  --- 比较有争议的,进入特殊的状态(删除态:Hibernate中不建议使用的)
持久态对象转成脱管态对象
session的close()/evict()/clear();
 - 脱管态-- 有持久化标识OID,没有被纳入到Session对象的管理
获得托管态对象:不建议直接获得脱管态的对象.
User user = new User();
user.setId(1);
脱管态对象转换成持久态对象
update();/saveOrUpdate()/lock();
脱管态对象转换成瞬时态对象
user.setId(null);
 - 注意:持久态对象有自动更新数据库的能力!!!


![Hibernate持久化对象的状态的转换][2]


代码演示: 持久态对象有自动更新数据库的能力


![持久态对象有自动更新数据库的能力][3]


Session对象的一级缓存

1. 什么是缓存?
其实就是一块内存空间,将数据源(数据库或者文件)中的数据存放到缓存中.再次获取的时候 ,直接从缓存中获取.可以提升程序的性能!

2. Hibernate框架提供了两种缓存
一级缓存 -- 自带的不可卸载的.一级缓存的生命周期与session一致.一级缓存称为session级别的缓存.
二级缓存 -- 默认没有开启,需要手动配置才可以使用的.二级缓存可以在多个session中共享数据,二级缓存称为是sessionFactory级别的缓存.

3. Session对象的缓存概述
Session接口中,有一系列的java的集合,这些java集合构成了Session级别的缓存(一级缓存).将对象存入到一级缓存中,session没有结束生命周期,那么对象在session中存放着
内存中包含Session实例 --> Session的缓存(一些集合) --> 集合中包含的是缓存对象!

4. 证明一级缓存的存在,编写查询的代码即可证明
在同一个Session对象中两次查询,可以证明使用了缓存

5. Hibernate框架是如何做到数据发生变化时进行同步操作的呢?
使用get方法查询User对象
然后设置User对象的一个属性,注意:没有做update操作。发现,数据库中的记录也改变了。
利用快照机制来完成的(SnapShot)


测试一级缓存:
![一级缓存][4]


控制Session的一级缓存

学习Session接口中与一级缓存相关的方法
Session.clear() -- 清空缓存。
Session.evict(Object entity) -- 从一级缓存中清除指定的实体对象。
Session.flush() -- 刷出缓存(原本是提交事务才缓存比较快照,flush刷新会提前比较)


快照机制

![快照机制][5]
原文地址:https://www.cnblogs.com/sybk/p/10004739.html