当前位置: 首页 > news >正文

Hibernate的FlushMode

一、Session中FlushMode的设置:

在事务开启前设置FlushMode属性,方法:

// session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL)。@Service
public class TestService {Logger log = LoggerFactory.getLogger(getClass());@AutowiredEntityManager entityManager;public FlushModeType getFlushModeType() { // entityManager.setFlushMode(FlushModeType.AUTO);       return entityManager.getFlushMode();}
}

SpringBoot 中 application.yml 配置: 

spring:jpa:properties:org:hibernate:# FlushMode#   ALWAYS 和 AUTO的区别:#   当hibernate缓存中的对象被改动之后, 会被标记为脏数据(即与数据库不同步了)。#   当 session设置为FlushMode.AUTO时, hibernate 在进行查询的时候会判断缓存中的数据是否为脏数据,#   是则刷数据库, 不是则不刷, 而always是直接刷新, 不进行任何判断。很显然 auto 比 always 要高效得多。#   ALWAYS: 每次进行查询、提交事务、session.flush()的时候都会刷数据库#   AUTO: 设置成auto之后, 当程序进行查询、提交事务或者调用session.flush()的时候, 都会使缓存和数据库进行同步, 也就是刷新数据库#   COMMIT: 提交事务或者session.flush()时, 刷新数据库;查询不刷新#   MANUAL: 如果FlushMode是MANUAL或NEVEL, 在操作过程中hibernate会将事务设置为readonly, 所以在增加、删除或修改操作过程中会出现错误#   NEVER: 已经废弃了, 被MANUAL取代了flushMode: AUTO

FlushMode有5个值可选:

1  NEVEL   

已经废弃了,被MANUAL取代了

2 MANUAL 

spring3.x中的opensessioninviewfilter已经将默认的FlushMode设置为MANUAL了;如果FlushMode是MANUAL或NEVEL,在操作过程中hibernate会将事务设置为readonly,所以在 增加、删除或修改 操作过程中会出现如下错误:
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read - only mode (FlushMode.NEVER)  -  turn your Session into FlushMode.AUTO or remove  ' readOnly '  marker from transaction definition;解决办法网上有很多;1 配置事务,spring会读取事务中的各种配置来覆盖hibernate的session中的FlushMode;2 先编程式修改FlushMode,比如session.setFlushMode(FlushMode.AUTO); 这样hibernate就会自动去除readonly限制;3 直接修改opensessioninviewfilter过滤器的配置,配置过滤器的时候配置
<filter><filter-name>openSession</filter-name><filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class><init-param><param-name>flushMode</param-name><param-value>AUTO</param-value></init-param></filter>

3 AUTO

设置成auto之后,当程序进行查询、提交事务或者调用session.flush()的时候,都会使缓存和数据库进行同步,也就是刷新数据库

4 COMMIT

提交事务或者session.flush()时,刷新数据库;查询不刷新

5 ALWAYS

每次进行查询、提交事务、session.flush()的时候都会刷数据库
这里需要说一下和AUTO的区别,当hibernate缓存中的对象被改动之后,会被标记为脏数据(即与数据库不同步了)。当session设置为FlushMode.AUTO时,hibernate在进行查询的时候会判断缓存中的数据是否为脏数据,是则刷数据库,不是则不刷,而always是直接刷新,不进行任何判断。很显然auto比always要高效得多。

JPA的FlushModeType只有两种:

1、COMMIT:仅当提交事务时才能进行刷新

2、AUTO:(默认)在执行查询时进行刷新

二、Session中flush()方法说明:

可以强制进行从内存到数据库的同步,方法session.flush()

例: 

/** * flush 强制与数据库同步 */  
@Test  
public void testFlush(){  Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  session.beginTransaction();  Teacher t = (Teacher) session.get(Teacher.class, 3);  t.setName("yyy");  t.setName("yyyyy");  session.getTransaction().commit();  
}  

看这段代码,我们setName() 2次, 但程序只会更改数据库一次,在commit时。

/** * flush 强制与数据库同步 */  
@Test 
public void testFlush(){  Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  session.beginTransaction();  Teacher t = (Teacher) session.get(Teacher.class, 3);  t.setName("yyy");  session.flush();//有flush会执行2次UPDAE,没有会只执行一次  t.setName("yyyyy");  session.getTransaction().commit();  
}  

我们在第2次setName()时 执行session.flush()

再看hibernate 执行的sql 语句

Hibernate: updateTeacher setbirthday=?,name=?,title=? whereid=?
Hibernate: updateTeacher setbirthday=?,name=?,title=? whereid=?

执行了2次Update

所以看出来flush方法会强制与数据库同步。

flush方法是可以设置的,也就是fulsh什么时候执行是可以设置的(第一条有说明)。

二、Session中Clear()方法说明:

无论是 Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强制清除Session缓存。

例:

public void testClear(){  Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  session.beginTransaction();  Teacher t = (Teacher) session.get(Teacher.class, 3);  System.out.println(t.getName());  Teacher t2 = (Teacher) session.get(Teacher.class, 3);  System.out.println(t2.getName());  session.getTransaction().commit();  
}  

这里虽然用了2个get方法(get方法会立即执行sql语句),但因为第一次执行了会缓存一个ID为3的实体,所以虽然有2个get方法只执行一次SQL语句。

public void testClear(){  Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  session.beginTransaction();  Teacher t = (Teacher) session.get(Teacher.class, 3);  System.out.println(t.getName());  session.clear();//这里不clear只会执行一次sql语句,有clear会执行2次  Teacher t2 = (Teacher) session.get(Teacher.class, 3);  System.out.println(t2.getName());  session.getTransaction().commit();  
}  

这里在第2次get前执行session.clear(), 我们把 hibernate show_sql 出来,它就会执行2次sql语句了。

所以session.clear()会清除缓存。

相关文章:

Hibernate的FlushMode

一、Session中FlushMode的设置&#xff1a; 在事务开启前设置FlushMode属性&#xff0c;方法: // session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL)。Service public class TestService {Logger log LoggerFactory.getLogger(getClass());AutowiredEntityM…...

二线程序员的出路

最近长沙不太平。去年被动离职一拨人之后&#xff0c;HR一直强调降本增效&#xff0c;人人自危&#xff0c;挤走一拨人&#xff0c;反正会有大量内卷失败的一线程序员进来填坑。当然留就有人走&#xff0c;前同事除了几个出去搞培训创业&#xff08;后面解散了&#xff09;的之…...

MKS SERVO4257D 闭环步进电机_系列2 菜单说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&am…...

使用Actor-Critic的DDPG强化学习算法控制双关节机械臂

在本文中&#xff0c;我们将介绍在 Reacher 环境中训练智能代理控制双关节机械臂&#xff0c;这是一种使用 Unity ML-Agents 工具包开发的基于 Unity 的模拟程序。 我们的目标是高精度的到达目标位置&#xff0c;所以这里我们可以使用专为连续状态和动作空间设计的最先进的Deep…...

黑马学生入职B站1年,晒出21K月薪:我想跳槽华为

现在的Z时代&#xff0c;嘴上说着不要&#xff0c;身体却很诚实。 前两天&#xff0c;黑马发布了《2022年度互联网平均薪资出炉&#xff01;高到离谱&#xff01;》&#xff0c;信息传输、软件和信息技术服务业薪资遥遥领先&#xff01;Z时代举头望着天花板&#xff0c;故作潇…...

一文看懂GPT风口,都有哪些创业机会?

新时代的淘金者&#xff0c;低附加价值的创业要谨慎&#xff0c;高附加价值、低技术门槛创业也要谨慎&#xff0c;主干道边上的创业也要谨慎。不少朋友看完不淡定了&#xff0c;干什么都谨慎&#xff0c;回家躺平好了&#xff0c;我有个朋友&#xff0c;靠ChatGPT&#xff0c;半…...

chatgpt赋能python:Python中的不确定尾数问题

Python中的不确定尾数问题 Python作为一种高级编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发等众多领域。然而&#xff0c;Python在处理浮点数时会出现一些不确定尾数的问题&#xff0c;给程序员和数据分析员带来不少麻烦。本篇文章将介绍Python中不确定尾数的…...

杜绝开源依赖风险,许可证扫描让高效合规「两不误」

目录 开源许可证及其常见类型 开源许可证扫描是软件研发过程中&#xff0c;不可或缺的工具 极狐GitLab 开源许可证扫描的优势与应用 Step 1&#xff1a;启用及设置许可证策略 Step 2&#xff1a;自动创建策略文件存放项目 Step 3&#xff1a;查看许可证合规情况 Step 4&…...

【sop】含储能及sop的多时段配网优化模型

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了含sop的配电网优化模型&#xff0c;链接含sop的配电网优化,很多同学在咨询如何增加储能约束&#xff0c;并进行多时段的优化&#xff0c;本次拓展该部分功能&#xff0c;在原代码的基础上增加储能模…...

nodjs使用阿里云镜像安装

要使用阿里云镜像来安装 npm 包&#xff0c;你需要按照以下步骤进行操作&#xff1a; 首先&#xff0c;确保你已经安装了 Node.js 和 npm。你可以在终端&#xff08;或命令提示符&#xff09;中输入以下命令来验证它们的安装&#xff1a; node -v npm -v如果显示了 Node.js 和…...

C++ Primer Plus 第二章习题

目录 复习题 1.C程序的模块叫什么&#xff1f; 2.#include 预处理器编译指令的用处&#xff1f; 3.using namespace std; 该语句是干什么用的&#xff1f; 4.什么语句可以打印一个语句"hello,world"&#xff0c;然后重新换行&#xff1f; 5.什么语句可以用来创…...

两分钟学会 制作自己的浏览器 —— 并将 ChatGPT 接入

前期回顾 分享24个强大的HTML属性 —— 建议每位前端工程师都应该掌握_0.活在风浪里的博客-CSDN博客2分享4个HTML5 属性&#xff0c;开发必备https://blog.csdn.net/m0_57904695/article/details/130465836?spm1001.2014.3001.5501 &#x1f44d; 本文专栏&#xff1a;开发…...

HEVC中,mvd怎么写进码流的?

文章目录 Motion vector difference syntax 标准文档描述语义解释设计意义 Motion vector difference syntax 标准文档描述 语义解释 MvdL1[ x0 ][ y0 ][ compIdx ] L1列表的mvd x0,y0 表示亮度快左上角坐标 compIdx 0表示水平 compIdx 0表示垂直 mvd_l1_zero_flag&#xff1a…...

隐形黑客潜入美国和关岛关键基础设施而未被发现

微软和“五眼联盟”国家周三表示&#xff0c;一个隐秘的组织成功地在美国和关岛的关键基础设施组织中建立了一个持久的立足点&#xff0c;而没有被发现。 这家科技巨头的威胁情报团队正在以伏特台风(Volt Typhoon)的名义跟踪这些活动&#xff0c;包括入侵后的凭证访问和网络系…...

设计模式—“接口隔离”

在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采样添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 典型模式有:Fascade、Proxy、Adapter、Mediator 一、Fascade 动机 上述A方案的问题在于组件的客户和…...

【C++学习】异常

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 异常 &#x1f96e;异常&#x1f362;自定义异常体系&#x1f362;C标准库的异常体系&#x1f362;异…...

如何理解TCP是面向字节流协议?

传输层是网络协议中的重要层次之一&#xff0c;主要负责向两个主机中的进程之间的通信提供服务。传输层的主要功能包括复用和分用、流量控制、分段/重组和差错控制。传输层在终端用户之间提供透明的数据传输&#xff0c;向上层提供可靠的数据传输服务。 传输层的复用和分用功能…...

机器学习期末复习 线性模型

1.线性回归&#xff0c;对数几率回归&#xff0c;线性判别分析是分类还是回归任务&#xff1f;是有监督的学习还是无监督的学习&#xff1f; 有监督学习和无监督学习 解释&#xff1a; 线性模型要做的有两类任务&#xff1a;分类任务、回归任务 分类的核心就是求出一条直线w…...

Worker及XMLHttpRequest简单使用说明

Worker 一、作用及使用场景 在Web应用程序中创建多线程环境&#xff0c;可以运行独立于主线程的脚本&#xff0c;从而提高Web应用的性能和响应速度。 Worker.js主要应用场景包括&#xff1a; 数据处理&#xff1a;在数据量较大的情况下&#xff0c;使用Worker可以将数据分成…...

零基础如何入门网络安全?2023年专业学习路线看这篇就够了

前景 很多零基础朋友开始将网络安全作为发展的大方向&#xff0c;的确&#xff0c;现如今网络安全已经成为了一个新的就业风口&#xff0c;不仅大学里开设相关学科&#xff0c;连市场上也开始大量招人。 那么网络安全到底前景如何&#xff1f;大致从市场规模、政策扶持、就业…...

AgentCPM与JavaScript全栈开发:实时交互式研报问答机器人实现

AgentCPM与JavaScript全栈开发&#xff1a;实时交互式研报问答机器人实现 最近在做一个挺有意思的项目&#xff0c;想和大家聊聊怎么用JavaScript全栈技术&#xff0c;把一个强大的AI分析模型变成一个能实时对话的网页应用。想象一下&#xff0c;你打开一个网页&#xff0c;输…...

Silvaco TCAD实战:从零搭建nmos器件全流程(附Athena操作截图)

Silvaco TCAD实战&#xff1a;从零搭建NMOS器件全流程解析 在半导体工艺仿真领域&#xff0c;掌握TCAD工具就像获得了一把打开微观世界的钥匙。作为行业标准的Silvaco TCAD套件&#xff0c;其Athena模块专门针对工艺仿真而设计&#xff0c;能够精确模拟从硅片清洗到最终器件成型…...

OpenClaw技能组合:千问3.5-35B-A3B-FP8驱动的自动化工作流设计

OpenClaw技能组合&#xff1a;千问3.5-35B-A3B-FP8驱动的自动化工作流设计 1. 从零到一的自动化工作流实践 去年夏天&#xff0c;我接手了一个临时项目&#xff1a;需要每天处理上百封客户邮件&#xff0c;提取会议需求并安排日程&#xff0c;会后还要生成纪要同步给团队。手…...

比较器参数实测对比:LM393 vs LM311 vs MAX902(附测试数据)

比较器参数实测对比&#xff1a;LM393 vs LM311 vs MAX902&#xff08;附测试数据&#xff09; 在电子设计领域&#xff0c;比较器作为信号处理的关键元件&#xff0c;其性能直接影响系统的响应速度和精度。面对市面上琳琅满目的比较器型号&#xff0c;工程师们常常陷入选择困境…...

Go项目实战:手把手教你用GORM封装一个支持6种数据库(含4种国产库)的通用连接池

Go项目实战&#xff1a;构建支持6种数据库的GORM通用连接池 当企业级应用需要同时对接多种数据库时&#xff0c;开发团队往往面临巨大挑战。特别是当项目涉及国产数据库时&#xff0c;官方驱动支持不足、文档匮乏等问题会让开发周期大幅延长。本文将分享如何基于GORM构建一个支…...

OpenClaw技能开发入门:为Phi-3-vision-128k-instruct定制截图分析模块

OpenClaw技能开发入门&#xff1a;为Phi-3-vision-128k-instruct定制截图分析模块 1. 为什么需要定制截图分析技能 上周我在整理产品文档时遇到一个典型场景&#xff1a;需要从上百张软件界面截图中提取关键UI元素的文字描述和功能说明。手动操作不仅耗时&#xff0c;还容易遗…...

AR1020触摸控制器驱动开发:嵌入式I²C/SPI底层集成指南

1. AR1020 触摸控制器驱动技术详解&#xff1a;面向嵌入式系统的底层实现与工程集成Microchip AR1020 是一款高精度、低功耗的单芯片电容式触摸控制器&#xff0c;专为工业人机界面&#xff08;HMI&#xff09;、医疗设备面板、车载信息娱乐系统及消费类电子产品的触控屏设计。…...

8类草莓成熟病害检测数据集该数据集通过实际工业农场采集拥有图像1724张可使用YOLOV5、YOLOV6、YOLOV7、YOLOV8模型进行直接训练数据集为原始数据集,未经任何图像预处理已经

8类草莓成熟病害检测数据集 该数据集通过实际工业农场采集 拥有图像1724张 可使用YOLOV5、YOLOV6、YOLOV7、YOLOV8模型进行直接训练 数据集为原始数据集&#xff0c;未经任何图像预处理 已经划分为训练集&#xff0c;验证集和测试集&#xff0c;可直接使用&#xff0c;检测精度…...

【数据结构】顺序表的应用->通讯录(详细代码及配图)

小编主页详情<-请点击 小编gitee代码仓库<-请点击 本文主要介绍了数据结构的顺序表的应用->通讯录&#xff0c;内容全由作者原创&#xff08;无AI&#xff09;&#xff0c;同时深度解析了通讯录顺序表增删查改等功能&#xff0c;并带有配图帮助博友们更好的理解&#…...

我郑重声明:我的目标是图灵奖,这是理工男的执念!所以在第一时间发现可实现AGI蓝图的时候,就给图灵奖官方邮箱发了论文PDF,这是存档+时间戳。我知道,明确知道,最终的AGI实现必然走我的路子。哈哈哈

总有人拿民科来说事&#xff0c;仔细想咱真也是民科&#xff0c;&#xff0c;&#xff0c;没啥说的&#xff0c;没混上教授的&#xff0c;那个不是民科&#xff1f;&#xff1f;&#xff1f; 不要拿民科怎么样来说事&#xff0c;我开始没说自己咋样&#xff0c;真就只想那个图…...