Hibernate三状态,一级缓存,懒加载,急加载

[ESP32]:基于esp-modbus实现serial主机 阅读详情

一、hibernate实体有三个状态
1、瞬时状态 --->只在内存中存在,与数据库无关
当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:
1790884-20200317151617949-1417535798.png
这时user对象就处于自由状态,为什么说user对象处于自由状态呢?这是因为,此时user只是通过JVM获得了一块内存空间,还并没有通过Session对象的save()方法保存进数据库,因此也就还没有纳入Hibernate的缓存管理中,也就是说user对象现在还自由的游荡于Hibernate缓存管理之外。所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。
瞬时对象特点:
(1)不和 Session 实例关联
(2)在数据库中没有和瞬时对象关联的记录
2、持久状态 ---->内存中存在,数据库中也存在
在修改持久状态的时候,不会去立即同步数据库,会先放入到一级缓存,当我们提交事务的时候hibernate会把缓存与数据库同步(一定要事务的支持才会同步因为它是发了一个update语句)
持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。如下所示:
1790884-20200317152508964-1813730282.png
这时我们并没有显示调用session.update()方法来保存更新,但是对实体对象的修改还是会同步更新到数据库中,因为此时user对象通过save方法保存进数据库后,已经是持久化对象了,然后修改该对象的属性值,它仍然是持久化对象,所以它还处于Hibernate缓存的管理之中,这时当执行tr.commit()方法时,Hibernate会自动清理缓存,并且自动将持久化对象的属性变化同步到到数据库中。
   持久的实例在数据库中有对应的记录,并拥有一个持久化标识 (identifier).
   持久对象总是与 Session 和 Transaction 相关联,在一个 Session 中,对持久对象的改变不会马上对数据库进行变更,而必须在 Transaction 终止,也就是执行 commit() 之后,才在数据库中真正运行 SQL 进行变更,持久对象的状态才会与数据库进行同步。在同步之前的持久对象称为脏 (dirty) 对象。
持久化对象的特点:
(1)和 Session 实例关联
(2)在数据库中有和持久对象关联的记录
3、游离(脱管)状态------>在内存中存在,在数据库中不一定存在
当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它对应的记录。只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。如下所示:
1790884-20200317153254393-1228068325.png
当session关闭后,customer对象就不处于Hibernate的缓存管理之中了,但是此时在数据库中还存在一条与user对象对应的数据记录,所以此时user对象处于游离态
与持久对象关联的 Session 被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改,但无法与数据库同步。
脱管对象特点:
(1)本质上和瞬时对象相同
(2)只是比爱瞬时对象多了一个数据库记录标识值 id.

二、hibernate的缓存
1、默认支持一级缓存,一级缓存是session级别(上述持久状态就使用到了一级缓存)
在session中定义了一系列的集合来存储数据,它们构成session缓存。
只要session没有关闭,它就会一直存在。
当我们通过hibernate中的session提供的一些API例如 save get update等进行操作时,就会将持久化对象保存到session中,当下一次在去查询缓存中具有的对象(OID值来判断),就不会去从数据库查询,而是直接从缓存中获取。
Hibernate的一级缓存存在的目的就是为了减少对数据库访问。
1790884-20200317155253687-1291278415.png

2、可插拨式的缓存,二级缓存,二级缓存是sessionfactory 级别的缓存

三、hibernate的懒加载与急加载
1、懒加载是Hibernate为提高程序执行效率而提供的一种机制,简单说就是只有正真使用其属性的时候,数据库才会进行查询。

注意:能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性hibernate会初始化这些代理,或当相关联的session关闭后,再访问懒加载的对象将出现异常,如图:
1790884-20200317160727243-1486639932.png
在调用load方法时,并没有真实的去查询数据库,只是讲user对象与id放入一级缓存,当调用user的方法时才会真正的去查询数据库,以上图片中是先关闭session断开连接,才调用user.getUserName()方法,此时连接已经断开,所以会报错。

2、急加载在加载一个实体时,会立即从数据库中查询,与其关联的类也会被同时查询,如下图(不会报错,在执行get时就已经去数据库执行查询,对象已经存在内存中):
1790884-20200317160408050-2086286339.png

区别:
如果使用急加载程序会在第一次运行是把数据加载到内存会消耗一段时间,往后运行查找就会很快。

懒加载会现在内存中存储查询当前的表,相关联的表则会在真正查找的时候,进行查询。

EPSON RX8010SJ RTC实战:I2C寄存器配置避坑指南(附完整初始化代码) 本文详细解析了EPSON RX8010SJ RTC芯片在I2C寄存器配置中的常见问题与解决方案,包括TEST位、STOP位和中断控制等关键配置要点。通过实战经验分享和完整的初始化代码模板,帮助开发者避免常见陷阱,确保RTC模块的稳定运行。 阅读详情

相关推荐

【硬件开发】振铃

如果是开关管的振铃,那么桥臂的SW处产生的振铃会窜入驱动电路,造成的结果就是驱动电路和上桥臂下桥臂之间的SW节点都会有振铃现象。如果是驱动电路的振铃,那么MCU的输出引脚还是正常的PWM,但是到了MOS管两侧就变成带有振铃的PWM波形了。开关振铃产生的原因是MOS管上面的寄生电感当开关管打开为了保持电流不变感应出的电压会对电源和地产生冲击。开关管的驱动线上的寄生电容和寄生电感导致的振铃为驱动电路振铃。开关管上的寄生电容和寄生电感导致的振铃为开关节点振铃。、电感等元件的存在,导致电路中的电压和。

weixin_62546664的博客 1792

解决hibernate懒加载出现死循环,在两方双方数据都需要的情况下

在最近开发过程中遇到一个需求:查询用户信息,附带角色列由于用户和角色之间为多对多的映射关系,在使用hibernate懒加载后,出现“你中有我,我中有你”转json数据出现死循环,导致程序无法正常执行由于双方数据都需要保存,采用了一个比较简单的方式解决:手动解除关系,借用Dto辅助类实现关系的破解:辅助类1@Datapublic class OutPutQueryRoleByPageDTO { i...

Master_chaoAndQi的博客 1300

6、深入解析Microsoft 365核心服务对比与迁移策略

本文深入解析了Microsoft 365的核心服务,包括身份和设备管理、现代设备配置体验、Exchange和SharePoint的迁移策略以及Microsoft Teams的协作功能。同探讨了迁移过程中需要考虑的安全控制措施,为组织规划和实施云迁移项目提供了全面的指导和建议。

k8s6orchestrator的博客 83

Hibernate 5.0以后的懒加载实现及懒加载失效问题解决

目前工作中有个需求,需要对单张的某个字段使用大字段(长字符串)来存储数据。使用oracle存储,即该字段会使用CLOB来存储长字符内容。那么该字段通过jpa进行实体设计如图所示:其中@Basic指定为懒加载模式,这里对大字段使用懒加载模式是比较合适的,例如在列查询往往是不用直接展示该字段内容的,一般只有在修改或查看详情才会进行该字段的展示,我本次的工作需求即是如此,故采用懒加载

天下唯一的利哥哥的博客 1260

hibernatesave,update,saveOrUpdate与状态的关系

首先来了解下save(): 当save(Object)的候分3种情况:  一,当object是临状态候:   ①当id策略为native的候,当执行save候会向数据库发一条insert 语句,并获取id。 ②当id为aasiged的候,save候仅仅会持久化,然后commit的候发出一条Insert 语句。 二,当object是游离对象的候: ①当id策略为n

zjlolife的专栏 1737

Hibernate懒加载加载我们需要注意的问题

1、显而易见的概念懒加载——也被称为延迟加载,它在查询的候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的候才会访问数据库。加载——就是只要我们实体做了关联,全部一次性执行完所有的SQL语句2、@OneToMany ****默认为懒加载**** @Test public void find(){ Session s= sessionFactory.

cd_cd的专栏 1957

hibernate态、缓存懒加载加载

@hibernate态、缓存懒加载加载 一、hibernate对象的状态 Hibernate中对象有状态: 临状态(Transient)、持久状态(Persistent)、游离状态(Detached); ①临状态:刚刚使用new语句创建,还没有被持久化,不处于Session的缓存中。处于临状态状态的Java对象被称为临对象。(即只在内存中存在,与数据库无关) ②持久化状态...

qq_40852762的博客 922

Hibernate状态的区别,持久化状态一级缓存懒加载加载

Hibernate状态 1、瞬状态 : 由 new 操作符创建,且尚未与Hibernate Session 关联的对象是瞬的` ,如果没有被使用,还会被gc回收: //瞬状态 RoleEntity r=new RoleEntity(); r.setRoleName("教师");` 2、持久状态 ---->内存中存在,数据库...

weixin_45989618的博客 243

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

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

motionEnabled 735

hibernate数据的状态,以及懒加载加载

hibernate数据的状态,以及懒加载加载 Hibernate框架的作用 Hibernate主要用来实现Java对象和数据库的之间的映射,除此之外还提供数据 查询和获取数据的方法 Hibernate可以大幅度减少开发手动编写SQL语句和JDBC代码的Hibernate可以完全隔离数据库,解耦项目与数据库的依赖关系 Hibernate的目标是简化开发者通常的数据持久化相关编程任务...

weixin_45518642的博客 265

对象的状态一级缓存懒加载

一、对象的状态 Hibernate中对象的状态:临/瞬状态、持久化状态、游离状态。 1.临状态特点 直接new出来的对象; 不处于session的管理; 数据库中没有对象的记录。 2.持久化状态 当调用session的save/saveOrUpdate/get/load/list等方法的候,对象就是持久化状态。处于持久化状态的对象,当对对象属性进行更改的候,会反映到数据库...

aokouzan2865的博客 106

@hibernate态、缓存懒加载加载

一、hibernate对象的状态 Hibernate中对象有状态: 临状态(Transient)、持久状态(Persistent)、游离状态(Detached); ①临状态:刚刚使用new语句创建,还没有被持久化,不处于Session的缓存中。处于临状态状态的Java对象被称为临对象。(即只在内存中存在,与数据库无关) ②持久化状态:已经被持久化,加入到Session的缓存中。处...

weixin_45984063的博客 184

Hibernate中的一级缓存、二级缓存懒加载

一、一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短间内这个 session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据; (2)二级缓存就是SessionFactory级别的缓存,顾名思义,就是查询的

七月流星 348

Hibernate一级缓存加载策略、处理并发

1.Hibernate一级缓存: 学习前需要先了解: Hibernate是通过实体对象来操控数据库的 Hibernate对象有状态:     1.临状态:java程序实例化出来的对象,随着java程序的关闭而死亡     2.持久化状态:从数据库获得的对象,处于该状态     3.游离状态:与session断开关联的对象所处的状态 注:状态是可以相互转换,转换图如下   缓存:...

li1470846的博客 673

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

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

m0_68879220的博客 226

Hibernate 基本操作、懒加载以及缓存

上一篇咱们介绍了 Hibernate 以及写了一个 Hibernate 的工具类,快速入门体验了一波 Hibernate 的使用,我们只需通过 Session 对象就能实现数据库的操作了。现在,这篇介绍使用 Hibernate 进行基本的 CRUD、懒加载以及缓存的知识。本篇文章主要讲了基本的 CRUD 操作,都是通过 Session 去操作的,根据一个持久化类的类型以及一个唯一标识进行相关操作,然后讲了 Hibernate 中的对象的状态,有 4 种,分别是瞬、持久、游离、删除。

Gefangenes的博客 398

4、JPA 一级缓存-延迟加载-对象状态

一级缓存一级缓存缓存清空案例 多次查询查看打印SQL延迟加载 懒加载对象状态对象状态改变案例分析下面打印出的SQL 一级缓存 在EntityManager中存在一个一级缓存区域,称之为一级缓存; 每次查询会把查询结果保存到一级缓存区中,下次再次查询会根据主键ID判断是否缓存中有值,有则直接取出。 EntityManager 是线程不安全的,每次请求都会是一个全新的对象,一级缓存只存在于这个EntityManager中,缓存是有限的 缓存清空 在EntityManager提交事务或关闭之后,一级缓存会被

红鹰 1177

hibernate入门(加载策略、管理对象、一级缓存及快照)

hibernate入门(加载策略、管理对象、一级缓存及快照)加载策略load 懒加载/延迟加载示例get 立即加载示例代理对象hibernate管理对象的状态流程图一级缓存及快照 加载策略 指hibernate查询数据,采用什么样的方式将数据写入内存。Hibernate中提供了两种方式来加载数据:懒加载和即加载懒加载懒加载又称延迟加载,指使用hiberante API查询数据,不会立即将数据写入内存。而是等到真正使用数据才会发出sql语句,到数据中查询数据。 即加载:指使用hiberna

licmi的博客 219

hibernate状态一级缓存加载策略

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

qq_43226989的博客 204
上一篇: 12-18:Servlet过滤器
下一篇: hibernate的查询、删除、修改基本操作
libobo22
博客等级 码龄7年 1粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值