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

hibernate中session.flush()

flush()
session flush在commit之前默认都会执行, 也可以手动执行,他主要做了两件事:
1) 清理缓存。
2) 执行SQL。
flush: Session 按照缓存中对象属性变化来同步更新数据库。


默认情况下,Session 会在以下情况下调用 flush刷新缓存:
1、显式调用 Session 的 flush() 方法
2、当应用程序调用 Transaction 的 commit()方法的时, 该方法先 flush ,然后在向数据库提交事务
3、当应用程序执行一些查询(HQL, Criteria)操作时,如果缓存中持久化对象的属性已经发生了变化,会先 flush 缓存,以保证查询结果能够反映持久化对象的最新状态
Session 的 save() 方法使一个临时对象转变为持久化对象


Session 的 save() 方法完成以下操作:
1、把 News 对象加入到 Session 缓存中, 使它进入持久化状态
2、选用映射文件指定的标识符生成器, 为持久化对象分配唯一的 OID. 在 使用代理主键的情况下, setId() 方法为 News 对象设置 OID 使无效的.
3、计划执行一条 insert 语句:在 flush 缓存的时候(意思是flush执行insert语句,但是未执行commit)

 

flush 缓存的例外情况:如果对象使用native 生成器生成 ID 时,在当调用session.save() 去保存对象时, 会直接向数据库插入该实体的 insert 语句。
如果session 中的某个类的属性发生了改变,使用flush() 方式,去更改数据库中的记录,使其和改变后的session 中的对象一致
Force this session to flush.强制刷新流的缓冲。flush必须在一个操作单元结束之后且在提交事务和关闭连接之前被调用。例如插入一条数据。
sess.save(user);的意思是将user持久化,

    /*
     * 现在我的主键生成策略是uuid,这个主键是由Session生成,执行完save就会生成主键。
      * user对象会存储在Session的临时存储区以及持久区。
        * 这里是不会发送ql语句的,sql语句是在执行flush();方法的时候被执行。
    */
    session.save(user);
    /*
     * 发出sql语句,清理临时存储区,将dirty由true变为false,表示此时的数据不是脏数据,没有flush之前是脏数据。
     */ 
    session.flush();
    t.commit();

session.save(),进行插入数据操作时,一直没有成功,也没有报错。后来发现是因为没有创建事务,提交事务的原因
你对flush和commit的意思没有理解到:
1,flush代表刷新,同步一级缓存中的对象到数据库中,仅仅代表把SQL刷到了数据库中(意思是flush执行insert语句,但是未执行commit)
2,commit代表提交事务,tx.commit之后,之前发送的SQL才真正提交了,数据表里面才有值;
3,在默认情况下,commit之前都要自动调用flush,
所以:
1,session.save();session.flush()只是把SQL发到了数据库中,事务没有提交,数据表中还是没有数据的,
2,session.save(),transaction.commit(),在commit的之前,隐含调用了flush,即发送了SQL,又提交了事务,所以有值;

转载于:https://www.cnblogs.com/zhaoyanhaoBlog/p/11288304.html

相关文章:

  • [模板]区间第k大整体二分
  • 使用Docker快速部署Storm环境
  • 谈谈Java多线程
  • jzoj2866. 【集训队互测 2012】Bomb
  • python自动化运维技术读书笔记
  • js同步和异步
  • 并发并行同步异步多线程
  • 猿辅导 2019年 校招提前批笔试
  • RequireJs入门
  • Asp.net页面的生命周期
  • 终于弄好了 homework-09
  • python面向对象
  • leetcode 337. House Robber III
  • Durandal入门
  • js中使用EL表达式总结
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • Brief introduction of how to 'Call, Apply and Bind'
  • ES6 学习笔记(一)let,const和解构赋值
  • extract-text-webpack-plugin用法
  • js操作时间(持续更新)
  • markdown编辑器简评
  • Next.js之基础概念(二)
  • vue脚手架vue-cli
  • 创建一个Struts2项目maven 方式
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 使用Swoole加速Laravel(正式环境中)
  • 我看到的前端
  • 阿里云服务器如何修改远程端口?
  • 组复制官方翻译九、Group Replication Technical Details
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (4.10~4.16)
  • (ros//EnvironmentVariables)ros环境变量
  • (二)学习JVM —— 垃圾回收机制
  • (剑指Offer)面试题34:丑数
  • (六)vue-router+UI组件库
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (算法)N皇后问题
  • (一一四)第九章编程练习
  • (转)http-server应用
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 中创建支持集合初始化器的类型
  • .py文件应该怎样打开?
  • /etc/shadow字段详解
  • @Autowired和@Resource的区别
  • @Documented注解的作用
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @media screen 针对不同移动设备
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • []error LNK2001: unresolved external symbol _m
  • [100天算法】-实现 strStr()(day 52)