Hibernate第七篇【对象状态、一级缓存】

前言

本博文主要讲解Hibernate的细节—->对象的状态和一级缓存…

对象状态

Hibernate中对象的状态:
- 临时/瞬时状态
- 持久化状态
- 游离状态

学习Hibernate的对象状态是为了更清晰地知道Hibernate的设计思想,以及是一级缓存的基础…当然啦,也就一点点知识

临时/瞬时状态

当我们直接new出来的对象就是临时/瞬时状态的..

  • 该对象还没有被持久化【没有保存在数据库中】
  • 不受Session的管理

这里写图片描述

持久化状态

当保存在数据库中的对象就是持久化状态了

  • 当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态
  • 在数据库有对应的数据
  • 受Session的管理
  • 当对对象属性进行更改的时候,会反映到数据库中!

这里写图片描述

我们来测试一下:当对对象属性进行更改的时候,会反映到数据库中!


        session.save(idCard);
        idCard.setIdCardName("我是测试持久化对象");

这里写图片描述

游离状态

当Session关闭了以后,持久化的对象就变成了游离状态了…

  • 不处于session的管理
  • 数据库中有对应的记录

这里写图片描述


一级缓存

Hibernate有一级缓存和二级缓存之分,这里主要讲解一级缓存

什么是一级缓存?

Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!

只要是持久化对象状态的,都受Session管理,也就是说,都会在Session缓存中!

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

为什么要是使用缓存?

减少对数据库的访问次数!从而提升hibernate的执行效率!

测试

我们来看一下Hibernate是怎么减少对数据库访问的次数的。

现在我的User表有这么一条记录:

这里写图片描述

        //把数据放进cache
        User user = (User) session.get(User.class, 1);

        //发现要修改的字段和cache一样,不执行
        user.setUserName("你好2");

这里写图片描述

这里写图片描述

取数据也是一样的


        User user = null;
        user = (User) session.get(User.class, 1);
        user = (User) session.get(User.class, 1);

这里写图片描述


缓存相关的方法

和缓存有关常用的方法有三个:

  • session.flush(); 让一级缓存与数据库同步
  • session.evict(arg0); 清空一级缓存中指定的对象
  • session.clear(); 清空一级缓存中缓存的所有对象

  • clear


        User user = null;
        user = (User) session.get(User.class, 1);

        //清除缓存,那么下面获取的时候,就不能从缓存里面拿了
        session.clear();
        user = (User) session.get(User.class, 1);
  • flush

在有缓存的情况下,修改同一条记录的数据,以最后的为准…因此只有一条update


        User user = null;
        user = (User) session.get(User.class, 1);

        user.setUserName("我是第一");
        user = (User) session.get(User.class, 1);
        user.setUserName("我是第二");

这里写图片描述

我让强制让它和数据库同步的话,就有两条update了

        User user = null;
        user = (User) session.get(User.class, 1);

        user.setUserName("我是第一");
        session.flush();
        user = (User) session.get(User.class, 1);
        user.setUserName("我是第二");

这里写图片描述

一般地,我们在批处理的时候会用,因为缓存也是有大小的,如果1000条数据插入进去都要缓存,那么Hibernate可能就崩了…

  • 每隔一定记录数,先与数据库同步 flush()
  • 再清空缓存 clear()

值得注意的是:不同的Session是不会共享缓存的!

Iterator与list

我们使用HQL查询全部数据的时候,可以使用list()得到所有的数据,也可以使用iterator()得到一个迭代器,再遍历迭代器…那它们有什么区别呢?

。。。。当时看视频的时候说是下图:

这里写图片描述

但是我在测试的时候:List也可以获取缓存的数据

这里写图片描述

当然啦,Iterator也是可以获取缓存的数据

这里写图片描述

因此,在获取数据的时候还是使用list()方便!

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
基于 MATLAB 的综合能源系统建模案例  电平衡约束:P_{gt}(t)+P_{grid}(t)-P_{eb}(t)-P_{load}(t)=0,其中 P_{grid}(t) 为与外部电网的交互功率(正表示购电,负表示售电)。- 电锅炉的热输出功率 Q_{eb} 与输入电功率 P_{eb} 的关系为:Q_{eb}=\eta_{eb}\times P_{eb},其中 \eta_{eb} 为电锅炉的热效率。- 燃气轮机的余热回收功率 Q_{gt} 与发电功率也存在一定关系,例如:Q_{gt}=c\times P_{gt},c 为余热回收比例系数。 阅读详情

相关推荐

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 336

hibernate session缓存和java对象生命周期

hibernate session清理缓存时间和持久化对象机制 和 java对象生命周期

liang0000zai的专栏 4144

数字电路实验避坑指南:如何正确搭建主从JK触发器测试电路(附Proteus仿真)

本文详细解析了主从JK触发器的工作原理及实验搭建指南,重点解决了常见的Catching Problem现象,并提供了Proteus仿真优化方案。通过元器件选型、电路连接步骤和常见错误排查,帮助读者正确搭建测试电路,确保数字电路实验的稳定性和可靠性。

weixin_30790841的博客 470

Hibernate开发实践笔记--对象在set属性时更新了数据库问题

之前一直没发现这个问题,后来是因为我的导航栏数据库中数据发生变动后,产生菜单的时候又update了一遍数据库中的数据,使得部分数据值为空了,当时觉得很奇怪,后来仔细看了下log4j打印的日志发现其中有更新的动作,在代码中将数据库中获取到的对象set一个对象属性时,数据库就update了,但是这个问题是怎么产生的呢? 问题重述 Set users = new HashSet(); Use

王洋的专栏 1万+

RDMA网络通信技术、NCCL集合通讯(GPU)

NCCL 是 NVIDIA 专为 GPU 设计的高性能集合通信库,用于优化多 GPU、多节点间的集体操作(如 AllReduce、Broadcast、AllGather 等),是深度学习分布式训练的核心组件。RDMA 允许计算机直接访问远程内存,无需 CPU 干预,大幅降低了网络通信的延迟和 CPU 开销。常见的 RDMA 实现包括。是两项关键技术,用于优化节点间数据传输效率和大规模并行计算性能。在高性能计算(HPC)、人工智能训练和数据密集型场景中,

weixin_42795092的博客 2422

初识数据结构之入门必懂——线性表(顺序表)

本文将介绍数据结构中的线性表与线性表中最简单的结构——顺序表

m0_64705485的博客 905

SSH框架之Hibernate的对象状态、一级缓存

一、Hibernate的对象状态 1、Hibernate中对象的状态: 临时/瞬时状态、持久化状态、游离状态。 1)临时状态特点: a)直接new出来的对象。 b)不处于session的管理 c)数据库中没有对象的记录。 2)持久化状态特点: a)当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态。

一点一滴 925

解决vscode无法运行npm命令的问题(cmd可行)

Powershell以及vscode中npm命令使用不了

无痕坚守本心的博客 2750

Hibernate缓存简介及领域对象的三种状态

1. Session级别的缓存又叫做一级缓存;SessionFactory级别的缓存叫做二级缓存。 2.理解Session的缓存: •当Session的save()方法持久化一个Customer对象时,Customer对象被加入到Session的缓存中,以后即使应用程序中的引用变量不再引用Customer对象,只要Session的缓存还没有被清空,Customer对象仍然处于生命周期中

jialinqiang的专栏 3082

ARM与PC共享文件方式【samba】移植与配置

方式推荐指数适用平台优点缺点⭐⭐⭐⭐⭐全平台 (Win/Mac/Linux)兼容性最强,操作像本地文件配置稍繁琐,协议开销略大NFS⭐⭐⭐⭐Linux/Mac (Win支持一般)速度极快,CPU占用低Windows配置复杂,权限管理较难SFTP (SSH)⭐⭐⭐⭐全平台 (需客户端)安全加密,无需额外配置服务需使用FileZilla/Xftp等专用软件物理U盘⭐⭐⭐全平台无需网络,速度取决于接口需要人工插拔,不适合自动化Syncthing⭐⭐⭐⭐全平台自动同步,支持远程。

浩瀚之水的专栏 263

基于STM32L4XX 、HAL库的ATD5984步进电机驱动器驱动程序应用设计

一、简介: ATD5984是一款内部集成了译码器的微特步进电机 驱动器,能使双极步进电机以全、半、1/4、/1/8、1/16 和1/32步进模式工作。步进模式由逻辑输入管脚MSx选 择。其输出驱动能力达到28V±1.6A。 译码器是ATD5984易于使用的关键,通过STEP管脚 输入一个脉冲就可以使电机完成一次步进,省去了相序 表,高频控制线及复杂的编程接口,使其更适于没有复 杂的微处理器或微处理器负担过重的场合。 在步进操作期间,ATD5984的内部电路可以自动

PP_Cottage的博客 407

Hibernate(二)一级缓存、快照机制和三种状态

11

Waylon的博客 6024

【C语言笔记初级篇】第一章:C语言快速入门及注意事项

(1)第一个C语言程序 A:利用vs2010写C语言程序 1:按以下步骤新建工程 2:添加源文件,“.c”文件 B:第一个C语言代码 1:以下是基本的C语言程序 2:由于没有设置连接器,所以打印结果没有显示,按照如下步骤链接控制台 (2)数据类型 A:基本数据类型及占用字节 B:一些概念的梳理 概念一:关于计算机的单位 位(bit):计算机通过电路的开关和闭合处理信息,电路通...

快乐江湖的博客 3737

Hibernate——(5)持久化对象和一级缓存机制

一、对象的三种状态 1、暂时态:当对象刚创建,和Session没有发生任何关系时,当程序运行完就即刻消失,被称为暂时态。 2、持久态:当执行如下代码时,对象变为持久态 Emp e = new Emp(); session.save(); 持久态的对象和Session发生了关系,如执行了save,get,query等方法 Session中会缓存该对象(Session的缓存叫一级缓存)

水寒 3859

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Hibernate入门第六讲——持久化类的三种状态与Hibernate的一级缓存

持久化类 首先,开宗明义,再一次提醒大家,持久化类=Java类+映射配置文件。 持久化类的三种状态 Hibernate是一个持久层框架,它通过持久化类来完成ORM基本操作。Hibernate为了更好的管理持久化类,于是它就将持久化类分成了三种状态。 下面我会对每一个状态分别加以阐述。 瞬时态 瞬时态也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,且与Hibernate Ses...

李阿昀的博客 1966

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Hibernate-对象状态、一级缓存和懒加载

Hibernate-对象状态、一级缓存和懒加载对象状态例如对于: User user = new User();user有这几个状态:临时状态特点: 直接new出来的对象; 不处于session的管理; 数据库中没有对象的记录;持久化状态当调用session的save/saveOrUpdate/getloa/d/list等方法的时候,对象就是持久化状态。 处于持久化状态的对象,当对对象属性进行更

motionEnabled 738

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

七、一级缓存(一) -- hibernate对象状态 、一级缓存

一、hibernate 中对象的状态 Hibernate把对象分为4中状态: 临时状态。 持久化状态。 游离状态。 删除状态。 +++ 临时状态(直接new出来的对象) 举例: User user = new User(); 特点: 直接new出来的对象; 不处于session的缓存中, 数据库中没有对象的记录; +++ 持久化状态(托管状

weixin_45602227的博客 229

Hibernate中的三种数据持久状态和缓存机制

Java三大框架之——Hibernate中的三种数据持久状态和缓存机制Hibernate中的三种状态    瞬时状态:刚创建的对象还没有被Session持久化、缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID。     持久状态:对象经过Session持久化操作,缓存中存在这个对象的数据为持久状态并且数据库中存在这个对象对应的数据为持久状态这个时候有OID...

ywl470812087的博客 13万+

Hibernate的一级缓存与二级缓存的优缺点及缓存的生命周期

如果项目既使用了 Hibernate 又需要 Redis,可以考虑将 **Redis** 作为二级缓存的存储后端。在这种情况下,Hibernate 二级缓存的管理和缓存数据的存取将交由 Redis 来完成,既享受了 Hibernate 集成的便利,又利用了 Redis 在分布式、高并发场景中的优势。

qq1004722157的博客 1205

Hibernate对象状态与一级缓存

一、Hibernate对象状态 1、状态介绍 (1)瞬时态:transient,session没有缓存对象,数据库也没有对应记录 (2)持久态:persistent,session缓存对象,数据库最终会有数据 (3)游离态(脱管态)detached,session没有缓存对象,数据库有对应的记录 2、状态之间的转换 二、Hibernate一级缓存 1、一级缓存 一级缓存又称为s

shaonianbz的博客 510

Hibernate的一级和二级缓存

1. 管理session session对象的生命周期与本地线程绑定 thread 使用本地线程绑定,每次都从当前的线程提取session!!!     * 当前线程如果存在session对象,取出直接使用     * 当前线程如果不存在session对象,获取一个新的session对象和当前线程绑定 Session s1 = sf.getCurrentSession();

技术人生 6602

Hibernate进阶篇——缓存与对象状态

Hibernate快速入门指南 目录: Hibernate简介 Hibernate核心接口 Hibernate与Mybatis对比 Hibernate一级缓存与二级缓存 Hibernate持久化对象状态 Hibernate是什么?主要有三点: 1.它是开源轻量级的 2.它是JavaEE三层架构中的持久层框架 (所谓持久层框架:简单点说,就是负责数据持久化的框架,例如原始的...

IT修真院:初学者转行到互联网的聚集地 526

hibernate对象的三种状态、一级缓存、加载策略

一、hibernate管理对象的三种状态: 1、临时状态 2、持久状态 3、游离状态 1、hibernate是通过管理对象来操作数据,这里对象指的是持久化对象。 2、hibernate中的三种状态的对象是可以相互转换的,通常编码时只关注持久 化对象。关注get、save、update方法所操作后的对象 二、一级缓存、快照 一级缓存,又被称为session级别的缓存,session.get方法执行...

qq_43238210的博客 1645
上一篇: Hibernate第六篇【多对多映射、一对一映射】
下一篇: Hibernate第八篇【懒加载】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值