【Java】Hibernate的一级缓存Hibernate里的对象不同状态和Session的核心方法

Hibernate框架中Session对象状态转换详解 在Hibernate框架中,对象的状态管理是持久层操作的核心机制之一。Hibernate通过瞬时状态(Transient)持久化状态(Persistent)与脱管状态(Detached)三种状态来控制Java对象与数据库记录之间的映射与同步。理解这些状态的定义及其在Session生命周期中的表现,是掌握Hibernate持久化机制的关键。瞬时状态(Transient):尚未与Session关联、未持久化到数据库的对象。持久化状态(Persistent) 阅读详情

临时状态的测试:

Student student = new Student("张三", "男", 22, new Date());

//以上student就是一个Transient(临时状态),此时student并没有被session进行托管,即在session的缓存中还不存在student这个对象,当执行完save方法后,此时student被session托管,且数据库中也存在了该对象,student就变成了一个Persistent(持久化对象)

session.save(student); //save方法就是往数据库插入一条记录

结论: 此时我们知道hibernate会发出一条insert的语句,执行完save方法后,该student对象就变成了持久化的对象了

持久状态的测试1:

Student student = new Student("张三", "男", 22, new Date());

//以上student就是Transient(瞬时状态),表示没有被session管理并且数据库中没有执行save之后,被session所管理,而且,数据库中已经存在,此时就是Persistent状态

session.save(student);

//此时student是持久化状态,已经被session所管理,当在commit()提交时,会把session中的对象和目前的对象进行比较如果两个对象中的值不一致就会继续发出相应的sql语句

student.setSex("女");

//此时会发出2条sql,一条用户做插入,一条用来做更新

结论: 在调用了save方法后,此时student已经是持久化对象了,被保存在了session缓存当中,这时student又重新修改了属性值,那么在提交事务时,此时hibernate对象就会拿当前这个student对象和保存在session缓存中的student对象进行比较,如果两个对象相同,则不会发送update语句,否则,如果两个对象不同,则会发出update语句。

注意: 在调用save方法后,student此时已经是持久化对象了,记住一点:如果一个对象已经是持久化状态了,那么此时对该对象进行各种修改,或者调用多次update、save方法时,hibernate都不会发送sql语句,只有当事物提交的时候,此时hibernate才会拿当前这个对象与之前保存在session中的持久化对象进行比较,如果不相同就发送一条update的sql语句,否则就不会发送update语句

持久状态的测试2:

Student student = session.load(Student.class, 1); // 取出id等于1的学生记录

//上面的student是持久状态的对象

student.setAge(77); //修改了属性,让session提交commit事务的时候,student这个对象和session中的对象不一致,所以会发出sql完成更新

结论:当session调用load、get方法时,此时如果数据库中有该对象,则从数据库取出该对象也变成了一个持久化对象,被session所托管。因此,这个时候如果对对象进行操作,在提交事务时同样会去与session中的持久化对象进行比较,因此这里会发送两条sql语句。

持久状态的测试3:

Student student = session.load(Student.class, 1);

// load方法的作用:取出id等于1的学生记录

// 上面的student是取出后就是持久状态的对象

student.setAge(67);

// 修改了属性,让session提交commit事务的时候,student这个对象和session中的对象不一致,所以会发出sql完成更新

//但是提交事务之前, 清空session里的缓存

session.clear();

结论:这个时候在提交事务,发现已经session中已经没有该对象了,所以就不会进行任何操作

游离状态测试1:

Student student = new Student();

student.setId(2);

student.setName("李四");

//程序执行到这里,student就是一个游离对象的状态, 因为数据库中存在id=2的记录, 且这个student对象,又没被session托管,是离线状态的,所以它是游离状态

session.save(student);

//执行save, hibernate会以自己的规则,重新insert一条记录

结论:修改游离状态的对象的ID值不会报错,也没有任何效果,要把游离状态的对象转持久不能用save方法,要用update方法

游离状态测试2:

Student student = new Student();

student.setId(2);

student.setName("李四");

//程序执行到这里,student就是一个游离对象的状态, 因为数据库中存在id=2的记录, 并且这个student对象,又没被session托管,是离线状态的,所以它是游离状态

session.update(student);

// 执行update方法时,这个student对象,就从游离状态转变为了持久的状态了

student.setId(77); //报错, 不准修改

结论:持久状态的对象的ID值是不准修改的

游离状态测试3:

Student student = new Student();

student.setId(2);

//程序执行到这里,student就是一个游离对象的状态, 因为数据库中存在id=2的记录, 并且这个student对象,又没被session托管,是离线状态的,所以它是游离状态

session.delete(student);

// 执行delete方法,作用是讲对象的游离或持久状态删除,同时删除数据库中对应的记录。

结论: 这个时候的student对象已经不再是session托管的了,缓存中也不存在了,变成临时状态的对象了, 这时没有后续的操作,它会被垃圾回收机制从内存中处理掉!

游离状态测试4:

Student student = new Student();

student.setId(2);

//程序执行到这里,student就是一个游离对象的状态, 因为数据库中存在id=2的记录, 并且这个student对象,又没被session托管,是离线状态的,所以它是游离状态

session.saveOrUpdate(student);

// saveOrUpdate这个方法,是个偷懒的方法,当对象的状态是游离的,Hibernate就会去调用update方法,如果对象是临时状态的话,就调用save方法,这个方法不常用!

结论:有student.setId(2)这条语句,这个对象就会被假设是游离的,执行update方法,没有这条语句, 它会被Hivernate认为是临时状态,就执行save方法。

游离状态测试5:

Student student = session.load(Student.class, 1);

// load方法的作用:取出id等于1的学生记录

// 上面的student是取出后就是持久状态的对象

Student student2 = new Student();

//这时候的stutent2是临时的状态

student2.setId(1);

// 修改里student2的ID值,它就转游离的状态了

session.saveOrUpdate(student2);

//执行更新操作,它的状态会从游离转持久,我们的对象是用ID值来辨别身份的,所以在session的缓存中就存在了两份同样的对象,在session中不能存在两份拷贝, 所以报错

结论: Hibernate的session的缓存中不许用出现两个或两个以上有相同ID值的对象

最后总结一下:

①.对于刚创建的一个对象,如果session中和数据库中都不存在该对象,那么该对象就是瞬时对象(Transient)

②.瞬时对象调用save方法,或者离线对象调用update方法可以使该对象变成持久化对象,如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句

③.离线对象就是,数据库存在该对象,但是该对象又没有被session所托管

数学建模灵敏性分析(一阶、二阶灵敏度)python代码+懒人专用版 对于勉强看懂了灵敏度分析的同学来说,本文给出一个方便移植、修改的python程序,可以很方便地进行灵敏度分析。 阅读详情

相关推荐

2025.06.20【pacbio】|PB甲基化分析结果的统计与可视化介绍

本文介绍了PacBio甲基化数据的统计分析与可视化方法。主要内容包括:1) 分析甲基化位点分布、比例及染色体分布;2) 修饰基序(Motif)的统计与热图展示;3) 全基因组和局部区域测序深度可视化;4) 使用IGV查看单个reads修饰情况。文章提供了R代码示例,涵盖柱状图、分布图、热图等多种可视化形式,并建议了差异甲基化分析等进阶方法,帮助科研人员深入挖掘甲基化数据。

2067

Hibernate一级缓存:Session级对象一致性保障机制解析

Hibernate一级缓存是ORM框架中保障同一事务内对象身份一致性的核心机制,其本质是基于Identity Map模式的内存级状态管理。它并非性能优化组件,而是实现脏检查、延迟加载代理初始化、事务快照比对等关键能力的底层基础。该缓存与Session生命周期强绑定,不可关闭、不跨线程、不跨事务,天然支持Web应用典型的请求-响应模型。在Spring Data JPA中,findById()等操作默认受益于该机制,而getOne()返回的代理对象也依赖其完成懒加载时的实例复用。理解其作用边界,是规避LazyI

weixin_33507732的博客 234

电商智能客服Agent开发实战:从零到一构建企业级AI助手

电商智能客服Agent是下一代AI应用的核心形态,它不仅能够回答用户问题,还能自主规划任务、调用工具并执行完整工作流程。本文将深入探讨AI Agent的基本概念、技术实现方式及电商场景中的应用,提供完整的开发流程和代码示例,帮助开发者从零开始构建一个功能强大的电商智能客服系统。通过模块化设计、多轮对话记忆管理和工具集成,这个Agent能够处理订单查询、商品推荐、退换货流程等复杂任务,同时具备企业级的安全性和稳定性保障。通过本文的介绍,读者已经掌握了构建电商智能客服Agent的核心技术与实现方法。

m0_64363449的博客 1365

Hibernate中Session的核心方法一

前边我们讲过了Hibernate中Session的意义和如何使用Session的缓存,即Session是Hibernate提供的操作数据库的最主要的接口,这个Session当中提供了一系列查询、更新、删除、加载Java对象从而操作数据库的方法。Session最显著的特点是Session接口的实现类当中拥有一系列的Java集合,这些Java集合构成了Session缓存。Session缓存的作用是降低

qq792020962的博客 3462

【滚雪球学数学建模】第4.1节·概率与统计建模,一文搞懂!

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 1352

Arduino与震动马达模块握手

震动马达模块采用采用高品质手机震动马达,适用于震动感互动产品的制作,可穿戴智能设备震动提醒,适合作为非可听指示器的小型振动马达。当输入为高电平时电动机会震动,就像你的静音模式的手机一样。

vor234的博客 5849

Session缓存、Hibernate处理对象的状态了解

Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存,更新,删除和查询的方法。Session是有一个缓存, 又叫Hibernate的一级缓存session缓存是由一系列的Java集合构成的。当一个对象被加入到Session缓存中,这个对象的引用就加入到了java的集合中,以后即使应用程序中的引用变量不再引用该对象,只要Session缓存不被清空,这个对象一直处于生命周期中。

学习笔记,人工智能,教程,技术分享! 632

2025年广东省职业院校技能大赛高职组“区块链技术应用”正式赛题解析答案(标准答案参阅)

某公司规划开发一个区块链供应链金融平台,包括核心企业、供应商、银行等角色,通过智能合约代码逐步构建区块链供应链金融平台的基本功能,实现银行向核心企业提供授信并发行数字凭证,企业与企业之间转让数字凭证。此外需要完成区块链供应链金融平台的前后端,实现基本的业务逻辑

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1273

hibernate2+基础(hibernate的持久化类和对象标识符、Hibernate的一级缓存和对象状态、Hibernate的事务控制、Session 对象的生命周期与本地线程绑定、Hiberna...

第1章hibernate的持久化类和对象标识符 1.1持久化类的编写规范 1.1.1什么是持久化类: Hibernate是持久层的ORM映射框架,专注于数据的持久化工作。所谓的持久化,就是将内存中的数据永久存储到关系型数据库中。那么知道了什么是持久化,什么又是持久化类呢?其实所谓的持久化类指的是一个Java类与数据库表建立了映射关系,那么这个类称为是持久化类。其实你可以简单的...

banxihan9345的博客 311

倍福CX9020(WINCE 7)控制器使用方法和操作

CX9020系列是倍福控制器中较为经济的,操作系统为Windows Embedded Compact 7(简称WINCE7或WINEC7),相对高端控制器(WINES7以上系统),操作系统古老而简洁,上位机软件的编写困难很多,本文是笔者在使用过程中摸索的流程,旨在为CX9020系列的新用户提供参考,也可供其他CE系统的控制器参考。本文中大部分截图采用倍福中国的培训文档,这是由于笔者是在流程走通后再写这篇文章,不想再恢复出厂设置走一遍截图。因笔者在写这篇文章时使用倍福控制器经验并不丰富,难免有纰漏,请读者批评

weixin_41883890的博客 4287

Laser-Marking 激光振镜打标机的开源代码 - 下载 - 搜珍网

为了方便开发者的使用和定制化需求,我们在这里提供激光振镜打标机的开源代码,并附带详细的描述。首先,让我们来了解一下激光振镜打标机的基本原理。振镜系统由两个可移动的反射镜组成,可以控制激光束在水平和垂直方向上的偏转角度,从而实现对工件的精确控制。通过这段开源代码,开发者可以根据自己的需求对激光振镜打标机进行二次开发和定制化。你可以修改振镜角度、打标速度等参数,也可以添加其他功能,例如自动识别和追踪等。首先,我们创建了一个串口对象,用于与激光振镜打标机进行通信。函数实现了对用户输入文本的打标操作。

TechProX的博客 1279

Hibernate——Session方法

Session方法 操作Session缓存: 1.flush() 2.refresh() 3.clear() flush():使session缓存数据和数据库中一致(可能会调用update) 1.在Transaction 的 commit() 方法中:先调用session的flush方法,在提交事务 2.flush() 方法会执行sql语句,但是不会提交事务 3.在未提...

daguniang123的博客 1106

C#串口通信从入门到精通(11)——串口接收的数据存储到本地文件(txt、csv)

本文详细介绍如何将串口通信将数据进行本次存储,主要介绍常用的csv、txt格式文件,由多年实战经验总结,绝对干货!

qq_34059233的博客 7240

【Java】Hibernate-4:Session缓存、Hibernate处理对象的状态了解和搭建测试架子

Session接口是Hibernate操作数据库的核心接口,具有缓存机制(一级缓存),由Java集合实现。缓存功能包括减少数据库访问频率和保持对象与数据库同步。缓存清理时机包括事务提交、查询执行和手动调用flush()时。Hibernate对象存在三种状态:临时、持久和游离状态,Session负责对象状态管理。

CodeRunning的博客 261

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Hibernate笔记(核心组件、运行过程、缓存机制、对象状态转换)

参考:https://juejin.im/post/6844903573004746766 一、Hibernate核心组件 除配置文件,映射文件和持久化类外,Hibernate的核心组件包括以下几部分: 1.Configuration类:用来读取Hibernate配置文件,并生成SessionFactory对象。一个Configeration 实例代表Hibernate 所有Java类到Sql数据库映射的集合。 2.SessionFactory接口:产生Session实例工厂。 3.Session

Sid小杰的博客 335

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Java】Hibernate核心方法总结

Hibernate核心方法摘要:1) save/persist:将临时对象转为持久化对象,分配OID;2) get立即加载,load延迟加载;3) update更新游离对象为持久化对象;4) saveOrUpdate智能判断执行save或update;5) delete删除对象及数据库记录;6) evict从缓存移除对象;7) doWork支持原生JDBC操作。各方法在对象状态转换、数据加载策略和异常处理上各有特点,使用时需注意方法特性和适用场景。

CodeRunning的博客 1084

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Hibernate三种状态和Session常用的方法

我们知道Hibernate的核心就是对数据库的操作,里面的核心接口就是org.hibernate.Session接口。要想对数据库操作我们就要理清楚对象在整个操作中的所属的状态。 就像马士兵老师在视频中所说的,我们并不必死抠这些字眼,我们通过自己编写测试类就可以他们之间不同的区别。       session中常用的方法是save(),update(),saveOrUpdate()这些

Coder的不平凡 7179

Hibernate Session 事务隔离级别回顾 持久化对象的状态 Session核心方法

1 Session概述 Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存、更新、删除和加载Java对象的方法。 每一个Session对象都在内存中维护了一个缓存,位于缓存中的对象称为持久化对象,它和数据库表中的相关记录保持着一种对应关系。通过Session缓存,Hibernate最大限度的减少了应用程序访问数据库的次数,实现了对内存空间更加有效的

无道圣教主 576

hibernate中的Session详解

一、session概述 Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session对象有一个一级缓存,显示执行flush之前,所有的持久层操作的数据都缓存在session对象处。相当于JDBC中的Connection。持久化类与Session关联起来后就具有了持

li286487166的博客 1370

hibernate4之对象状态图和核心方法

  对象的状态转换图   持久化对象的状态   站在持久化的角度,Hibernate 把对象分为 4 种状态:持久化状态,临时状态,游离状态,删除状态。Session 的特定方法能使对象从一个状态转换到另一个状态。   临时对象(Transient): 在使用代理主键的情况下,OID 通常为 null 不处于 Session 的缓存中 在数据库中没有对应的记录   持久...

langdashu 240

Hibernate的Session介绍

Session Session是Hibernate向应用程序提供操作数据的主要接口, 他提供了保存、更新、删除、加载Java对象的方法。 Session的缓存 Session有一个缓存,用来缓存Java对象。一般的数据库操作,都要从先从Session的缓存中获取,如果缓存中获取不到,hibernate才会去数据库中获取。 缓存的作用 缓存的作用不言而喻。1、减少数据访问的频率。2、保

向北 1158

hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作

Session缓存原理 为了能够在控制台更好的看到我们的hibernate干了些什么,可以在hibernate.cfg.xml文件中写入如下配置: <!-- print all generated SQL to the console --> <property name="hibernate.show_sql">true</prop...

dongbei1970的博客 342

Hibernate框架(2)操作对象和一级缓存

Hibernate框架(2)操作对象和一级缓存主要内容1. Hibernate持久化对象的状态 2. Hibernate的一级缓存 3. Hibernate操作持久化对象的方法 4. Hibernate的基本查询 Hibernate的持久化类什么是持久化类1. 持久化类:就是一个Java类(咱们编写的JavaBean),这个Java类与表建立了映射关系就可以成为是持久化类。 * 持久化类 =

阳光丶不锈 382

Hibernate的脏数据检查机制:Session缓存与持久化上下文的生命周期

在数据库操作中,"脏数据"指的是那些已经被修改但尚未同步到数据库的数据。在 Hibernate 中,脏数据检查机制负责识别哪些持久化对象(Persistent Objects)的状态已经发生改变,需要在事务提交时同步到数据库。Hibernate 会将从数据库加载的对象的状态与当前对象的状态进行比较,如果检测到差异,就认为该对象是“脏的”,需要执行相应的 SQL 更新操作。

weixin_41455464的博客 765

hibernate中session和sessionFactory的作用

转载:https://blog.youkuaiyun.com/m0_37154839/article/details/79506466 https://www.cnblogs.com/baizhanshi/p/7686959.html configuration接口 Configuration负责管理Hibernate的配置信息。Hibernate运行时需要一些底层实现的基本信息。这些信息包括:数据库U...

qq_40797063的博客 781

Hibernate 学习之路(二): Hibernate中的Session详解和持久化对象(一)

什么是 Hibernate 的 Session Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connect...

450
上一篇: 从零搭建AI问答系统软件保姆级教程,Nano Banana AI绘画、扣子Agent插件、工作流+私有化部署教程文档
下一篇: 【Java】Hibernate核心方法总结
synchronizeOn
博客等级 码龄3年 1193粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值