hibernate学习-持久对象状态管理-第5天

本文详细解析了Hibernate框架中对象的四种状态:暂时态、持久态、游离态和无名态,以及状态之间的转换方法。同时,深入探讨了一级缓存的工作原理和快照机制,解释了如何利用缓存提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Hibernate 的对象状态

对象的状态一般是指对象的一组属性的值。而这里的状态是指对象处于什么存储介质
中。用于存放对象的存储介质有三个:普通内存(与 Hibernate 无关)、Session 缓存、数据
库。对象处于不同的介质,就将处于不同的状态。

二、状态转换

1、状态转换图
在这里插入图片描述
2、对象状态
(1)暂时态:transient 状态,对象在内存中存在,但 DB 中无记录,与 Session 无关,是个
过渡状态。
(2)持久态:persistent 状态,在内存中存在,DB 中有记录,与 Session 相关,在 Session
中有对象的副本。
(3)游离态:detached 状态,在内存中存在,在 DB 中有记录,与 Session 无关。
(4)无名态:在内存中不存在,但在 DB 中有记录,与 Session 无关。

3、状态转换常用方法
save( ):将暂时态对象同步到 DB 中。
update( ):将游离态对象同步到 DB 中。
delete( ):将指定的对象从 session 中删除,同时也删除 DB 中的该数据。
close( ):关闭 Session 对象。
clear( ):清空 Session 的缓存。
saveOrUpdate( ):根据参数对象的 id 属性是否为 null 来判断是执行保存还是更新操作。
evict():将指定对象仅仅从 session 中删除,但不删除 DB 中的该数据。
load( )与 get( ):将无名态对象转换为持久态对象

4、Hibernate 的同步机制
Hibernate 中的同步是指刷新缓存,以使缓存与 DB 中数据保持一致。当调用不同的状
态转换方法后,Session 能够在某些时间点完成缓存的刷新,将缓存中的持久化对象同步更
新到 DB。这些时间点是执行以下方法:
(1)Session 的 flush()
(2)事务的 commit()

三、一级缓存

在 Hibernate 的 Session 中具有一个缓存空间,称为一级缓存。当代码要做查询操作时,
会先从 Session 缓存中查找。若存在,则直接将其返回;若没有,则会先从数据库中查找,
找到后,将数据存放到 Session 缓存,再返回给程序。

    // 一级缓存
	@Test
	public void testFirstLevelCache(){
		try {
			session.beginTransaction();
			
			//第一次加载:从数据库中加载,并将其副本存于Session
			Student student1 = session.get(Student.class, 2);
			System.out.println("student1 = " + student1);
			
			//第二次加载:直接从Session中加载
			Student student2 = session.get(Student.class, 2);
			System.out.println("student2 = " + student2);
			
			//将student2从Session中删除
			session.evict(student2);
			
			//第三次加载:Session中副本已被删除,所以从数据库中加载,并将其副本存于Session
			Student student3 = session.get(Student.class, 2);
			System.out.println("student3 = " + student3);
			
			session.getTransaction().commit();
		} catch (Exception e) {

			e.printStackTrace();
			session.getTransaction().rollback();
		}
		
	}
	

其后台 SQL 的执行情况如下:
在这里插入图片描述

四、快照

快照,即副本。Hibernate 中的快照,即指一次数据库查询结果的副本,或一次对数据
库更新操作前数据的副本。快照中的数据始终保持与 DB 中数据是一致的,不能由代码对副
本中内容进行修改。其作用主要是为了在处理数据更新时,将 session 中数据与快照中数据
进行对比(即与 DB 中数据进行对比,因为快照中数据与 DB 中数据始终是一致的),以此来
判断是否真正执行 update 语句。
当代码通过 session 的查询方法调用,将数据加载到内存后,框架会将此数据存于一级
缓存,同时会在快照中也存放一个副本。session 的缓存中数据是可以修改的,但快照中数
据是不能修改的,始终保持与 DB 中数据是一致的。当事务在提交时,会首先对比一级缓存
中数据与快照中数据。若不一致,则说明数据发生更新,会将一级缓存中数据通过 update
语句更新到 DB 中。当然,快照中数据也会更新。若一致,则说明数据未发生改变,无需做
数据同步。
举例:snapeshot
在这里插入图片描述
其后台 SQL 的执行情况如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值