hibernate flush 机制

来源:http://www.cnblogs.com/yanbincn/archive/2012/05/31/2529293.html

 

 

针对昨天同事遇到的hibernate的问题。算是hibernate最基本的东西。具了解,这个问题很多人遇到过,也很常见,却遇到了还经常会懵了。
 
为了加深印象,知其然,知其所以然。
 
之后单纯用原始的Hibernate框架做了一些验证,并且打开执行SQL打印输出台的,得出的结论:
 
前提是在同一事务中间:
 
1、利用sql语句, session.createSQLQuery(sql).executeUpdate();进行插入,输出台打印出sql插入语句; 再利用sql语句,进行session.createSQLQuery(sql).uniqueResult(); 也会打印SQL查询语句,没有问题,可以查询到数据。
 
2、利用hibernate封装操作, session.save(entity); 进行插入,输出台并没有打印出插入的SQL语句, 再利用 session.get(entity,id);方法做查询 ;也没有打印出SQL查询语句,但是是可以查询到数据的。到执行事务提交语句时,插入的SQL语句被打印出来
 
3、利用hibernate的session.save(entity); 进行插入,再利用《HQL》语句进行查询,效果同上面第二点。
 
4、利用hibernate的session.save(entity); 进行插入,输出台并没有打印出插入的SQL语句。 再利用sql语句,进行session.createSQLQuery(sql).uniqueResult(); 会打印SQL查询语句。问题出现了,查询不到任何数据。这种情况下利用session.flush()方法,在查询之前执行到flush()方法,输出台会打印出插入的SQL语句。 再进行查询就有数据。
 
验证完成之后,查了下往上资料,对于第四点,在开发过程中出现频繁, 非常的常见,相信很多人都曾遇到,但又有很多人继续摸不到头脑。正好以此加深了印象。
 
从打印控制台SQL可以看出:一个基本的hibernate save方法的操作流程:
 
1. 判断所要保存的实例是否已处于持久化状态,如果不是,则将其置入缓存;
 
2. 根据所要保存的实例计划一条insert sql语句,注意只是计划,并不执行;
 
3. 事务提交时执行之前所计划的insert语句;
 
将tx.commit()换成session.flush,此时控制太打印出了insert语句,但是数据库中并没有添加新的记录;
 
flush方法的主要作用就是清理缓存,强制数据库与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据库发送一系列的sql语句,并执行这些sql语句,但是不会向数据库提交。而commit方法则会首先调用flush方法,然后提交事务。这就是为什么我们仅仅调用flush的时候记录并未插入到数据库中的原因,因为只有提交了事务,对数据库所做的更新才会被保存下来。因为commit方法隐式的调用了flush,所以一般我们都不会显示的调用flush方法。

这是hibernate的flush机制。在一些复杂的对象更新和保存的过程中就要考虑数据库操作顺序的改变以及延时flush是否对程序的结果有影响。如果确实存在着影响,那就可以在需要保持这种操作顺序的位置加入flush强制Hibernate将缓存中记录的操作flush入数据库,这样看起来也许不太美观,但很有效。

疑问:session.save方法,放入缓存中,SQL直接查询数据库是查不出来的。

       flush()方法之后,会打印出执行SQL,但是数据库中,还是没有。SQL直接查询却能查出数据来。
       1、flush() 之后这个实体数据存放在什么地方?和save()方法一样的缓存,那SQL也应该是取不到的。
       2、既然flush方法之后数据没有进数据库,SQL直接查询,利用session.createSQLQuery(sql) 查询,直接查得应该不是数据库,他查询的又是什么地方?
ZW3D 二次开发-制作插件 1.Windows 7 SP1 或 Windows 10 或 Windows 11(推荐 Windows 11)2.Visual studio 2017-2022 (或 C/C++的任何其他集成开发环境)(推荐 Visual studio 2022)3.ZW3D 2023 或以上版本(建议使用与 ZW3D 一致的 API 的版本)4.Qt5.9.7(for Windows)博主学习使用环境的是:Windows 11 Version 24H2 + Visual studio 2022 + Qt5.9.7(fo 阅读详情

相关推荐

OAK-D-Pro深度解析:从硬件融合到全天候SLAM实战

本文深度解析OAK-D-Pro硬件架构及其在SLAM领域的实战应用。作为SLAM的"六边形战士",OAK-D-Pro融合主动双目摄像头、结构光投射器、6轴IMU等传感器,实现全天候稳定工作。通过实测数据展示其在弱纹理环境、动态光照等复杂场景下的卓越表现,并提供SLAM实战技巧与开发指南,帮助开发者快速部署高效SLAM解决方案。

weixin_27244795的博客 183

hibernate在事务中的session.flush无效

项目中遇到了一个问题,明明都调用了hibernateTemplate.flush可是还是没有保存数据,看了hibernateTemplate.flush的源代码:public void flush() throws DataAccessException {/* 786*/ execute(new Hib

软件哲学 4233

基因家族扩张收缩分析可视化(CAFE5)

CafePlotter 是一个用于可视化 CAFE5 基因家族扩张收缩分析结果的 Python 工具

xuzhougeng blog 3638

hibernate flush问题

当在同一个事务使用sql(比如jdbctemplate或jpa的nativequery)时,需要把之前jpa或者em的操作flush出去,否则sql就会先执行,再执行hql。

山间明月江上清风的专栏 647

银河麒麟服务器操作系统V10-SP1部署gitlab服务

银河麒麟高级服务器操作系统 V10 SP1 部署GitHub

weixin_43173670的博客 2154

[A-21]ARMv8/v9-SMMU系统架构和功能概述

本文简述了SMMU的系统架构和核心功能

基层架构师的分享 1724

hibernate中的flush和commit

结论:commit时会自动flush commit后再进行flush会报错,如下 org.springframework.dao.InvalidDataAccessApiUsageException: no transaction is in progress; nested exception is javax.persistence.TransactionRequiredException: ...

岑如花 1505

ASPICE(Automotive SPICE)流程落地,研发管理工具自研,如何从量化数据体现研发效率提升的

摘要: ASPICE流程显著提升研发效率,主要体现在质量、成本和时间三个维度。关键量化指标包括:缺陷率降低30%-60%,维护工作量减少28%,研发周期缩短10%-20%,需求变更率降低58%,代码评审效率提升300%。初期开发成本虽增加9%,但长期回报率高。核心方法包括缺陷预防前移、需求精准管理和流程标准化与自动化。建立量化度量体系需覆盖缺陷密度、需求稳定性、进度偏差等指标,并依托工具链支持数据收集。实施ASPICE是短期投入换取长期质量提升和成本优化的高效投资。

汽车软件开发 183

hibernate先删除数据,紧接着执行插入时的异常解决之道——中间不能调用flush()、clear()等方法...

hibernate先删除数据,紧接着执行插入时的异常解决之道——中间不能调用flush()、clear()等方法   项目中包含这样一个寻常的业务:为某一个用户指定用户群。一个用户可以被分配到多个用户群中,后台管理者可以为该用户分配用户群,并可更新这种分配。在做更新的时候,将所有的用户群都以checkBod的形式显示出来,页面初始化的时候,那些用户已经关联的群的checkBox会被勾选,然后管理...

weixin_34212762的博客 909

【华为OD机考真题】- 构成的正方形数量(B卷-100分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 1349

CMake教程:C++ CMake自定义find_package并在其它项目使用

find_package 是 CMake 中一个非常重要的命令,用于在系统中找到外部库或包,并将其包含到项目中。: 要查找的包的名称。[version]: 可选的版本号。如果指定了版本号,CMake 会尝试找到该版本或更高版本的包。[REQUIRED]: 如果指定了这个关键字,找不到包时会产生一个错误并终止配置过程。: 指定要查找的包的组件。: 指定可选的组件,即使找不到这些组件,配置过程也会继续。: 指定查找包的模式,CONFIG表示查找配置文件,MODULE表示查找模块文件。

琅嬛福地 1563

hibernate的save 以及 flush 之坑

最近在用spring项目做接口开发 数据库用的是Hibernate4.0。 在做业务的时候有一个非常奇怪的错误, [ERROR][SqlExceptionHelper] ORA-00942: 表或视图不存在 [2021-03-26 12:07:55,753][ERROR][BatchingBatch] HHH000315: Exception executing batch [could not execute batch] [2021-03-26 12:07:55,754][ERROR][Base.

u011954243的博客 1802

MuJoCo XLA (MJX) 强化学习人形机器人四足机器人入门教程(三)

MJX 是用 JAX 编写的 MuJoCo 实现,可以在 GPU/TPU 上进行大批量训练。在本笔记本中,我们将演示如何使用 MJX 训练 RL 策略。在开始大量 RL 工作负载之前,我们先从一个简单的示例开始!xml = """"""接下来,我们使用 MJX 将 MuJoCo 模型和数据放到 GPU 设备上。下面,我们将打印来自 MuJoCo 和 MJX 的 qpos。

2506_90492529的博客 2472

深入Hibernate的flush机制

一、理解flush机制 之后单纯用原始的Hibernate框架做了一些验证,并且打开执行SQL打印输出台的,得出的结论: 前提是在同一事务中间: 1、利用sql语句, session.createSQLQuery(sql).executeUpdate();进行插入,输出台打印出sql插入语句; 再利用sql语句,进行session.cr

Vern的专栏 5571

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

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

浅谈Hibernate的flush机制

 随着Hibernate在Java开发中的广泛应用,我们在使用Hibernate进行对象持久化操作中也遇到了各种各样的问题。这些问题往往都是我们对Hibernate缺乏了解所致,这里我讲个我从前遇到的问题及一些想法,希望能给大家一点借鉴。        这是在一次事务提交时遇到的异常。       an assertion failure occured (this may ind

kinglino520的专栏 329

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

hibernate mysql flush_hibernate flush 机制

针对昨天同事遇到的hibernate的问题。算是hibernate最基本的东西。具了解,这个问题很多人遇到过,也很常见,却遇到了还经常会懵了。为了加深印象,知其然,知其所以然。之后单纯用原始的Hibernate框架做了一些验证,并且打开执行SQL打印输出台的,得出的结论:前提是在同一事务中间:1、利用sql语句, session.createSQLQuery(sql).executeUpdate(...

weixin_39619174的博客 187

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Hibernate的flush机制深入

Hibernate flush 机制:(执行save,update操作时,只是登记行为,flush时真正执行将登记行为插入数据库根据insert,update,……,delete的顺序提交所有登记的操作) //异常:unsafe use of the session Transaction tran = s.beginTransaction(); (1) s.save(cat); (2)(此

paul_wei2008的专栏 3191

Hibernate的flush机制详解

   原文:http://www.router.net.cn/Article/26554.html       随着Hibernate在Java开发中的广泛应用,我们在使用Hibernate 进行对象持久化操作中也遇到了各种各样的问题。这些问题往往都是我们对Hibernate缺乏了解所致,这里我讲个我从前遇到关于Hibernate flush的问题及一些想法,希望能给大家一点借鉴和帮助

碧海蓝天 892

hibernate的flush机制

针对昨天同事遇到的hibernate的问题。算是hibernate最基本的东西。具了解,这个问题很多人遇到过,也很常见,却遇到了还经常会懵了。为了加深印象,知其然,知其所以然。之后单纯用原始的Hibernate框架做了一些验证,并且打开执行SQL打印输出台的,得出的结论:前提是在同一事务中间:1、利用sql语句, session.createSQLQuery(sql).exe...

weixin_34253539的博客 73
上一篇: 从桥接模式与策略模式谈起
下一篇: Hadoop
gufengjava
博客等级 码龄16年 1粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值