问题

在spring框架没有事务的情况下,通过hibernate的session.save(entity),无法将数据持久化至数据库中,即使强制刷新后(flush())后也同样如此。

原因

混淆了spring框架中事务和mysql事务的概念。对于增删改操作,必须commit后才能持久化至mysql数据库。若不commit,只有在同一个连接中才能看到最新的更改,对其他连接不可见。

扩展

Hibernate的flush

执行时会清除session缓存并向数据库发送SQL语句并执行,但此时如果数据库当前存在一个事务,数据库会先将这些SQL语句缓存起来,那么此时在数据库中是无法看到SQL语句执行结果的。除非执行commit提交了事务。只要没有执行commit()方法,就能通过rollback()方法进行回滚。

Hibernate的commit

执行时会先隐式调用flush()方法,再提交事务。执行之后无法rollback()进行回滚。即commit操作才是真正的将实体数据持久化至数据库。

总结

通过hibernate进行数据库连接时,autocommit默认是false,因此仅仅做flush()是无法将数据持久化至数据库的,必须显式调用commit方法。
而如果使用jdbcTemplate进行数据库连接的话,无需显式执行commit方法,因为此时autocommit默认为true。通过以下代码验证之:

Connection conn = DriverManager.getConnection(JdbcTest.URL, JdbcTest.USER, JdbcTest.PWD); // 通过JDBC进行连接
SessionFactory sFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
Session session = sFactory.openSession(conn); // 使用jdbc的连接初始化hibernate的session
System.out.println(session.connection().getAutoCommit()); // autoCommit默认为true

Hibernate flush理解相关推荐

  1. hibernate缓存理解

    为什么80%的码农都做不了架构师?>>> 1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数!  只在session范围有效 ...

  2. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(1):Mybatis和Hibernate概念理解...

    一.关键字说明: oop:面向对象 aop:面向切面 ioc:控制反转 orm:对象关系映射 pojo:数据库表映射的java实体类 二.常识说明: 1.hibernate和mybatis都属于持久层 ...

  3. 面试题:谈谈你对hibernate的理解

    说说这类问题一般要和一个东西比較.说说他们的长处和缺点,hibernate就和JDBC比較呗.你就说说JDBC的优缺点.然后说说hibernate的优缺点,最后对照得出hibernate更好. hib ...

  4. 关于Struts+Spring+Hibernate的理解

    Struts,Spring和Hibernate是目前企业最流行的组合框架.一般一个Web项目分为四层:呈现层, 业务逻辑层. 持久层和数据库层.Struts负责呈现层...... 转载于:https: ...

  5. Servlet过滤器示例及分析----日志过滤器 以及对flush()理解

    很详细的讲解了简单的日志过滤器的原理,和PPT里的源代码一样! 有关代码中为什么要使用flush(): flush()意思是把缓冲区的内容强制的写出. 因为操作系统的某些机制,为了防止一直不停地磁盘读 ...

  6. Hibernate三种状态(Transient、Persistent、Detached)各种保存(save,persist,update,saveOrUpdte,merge,flush,lock)区别

    转载地址:http://www.2cto.com/kf/201212/178604.html 一.三种状态(Transient.Persistent.Detached) 在Hibernate中有三种状 ...

  7. Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...

  8. 【转】NHIBERNATE的各种保存方式的区别 (SAVE,PERSIST,UPDATE,SAVEORUPDTE,MERGE,FLUSH,LOCK)

    前言 今天学学习NH这个框架,在新增对象的时候,看见大神用了persist而没有用Save,心中比较疑惑,查阅资料的时候,发现这篇写的非常不错,转载供大家参考. hibernate的保存 hibern ...

  9. hibernate数据的三种存在状态(只与事务有关)

    Hibernate的对象有3种状态,分别为: <1>瞬时态 (Transient) <2>持久态(Persistent) <3>脱管态(Detached)  处于持 ...

最新文章

  1. 例解 autoconf 和 automake 生成 Makefile 文件
  2. Windows2008管理---第14章 高可用群集和QoS
  3. java mvc httpget怎么使用_springMVC正确使用GET POST PUT和DELETE方法,如何传递参数
  4. 【Python问题解决】关于解决python3.x无法使用PIL库的解决方法
  5. 计算机基础综合实验项目报告模板,计算机基础实验报告模板.doc
  6. 【转】Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用]
  7. 收藏功能_微软Edge获得了新的收藏夹菜单、PDF功能等
  8. 学计算机写作文怎么写,关于学电脑的作文
  9. 再谈Weiphp公众平台开发——1、成语接龙插件
  10. You are running Vue in development mode.Make sure to turn on production mode when deploying for p...
  11. windows下安装php5.5的redis扩展
  12. bzoj 3396: [Usaco2009 Jan]Total flow 水流(最大流)
  13. 在树莓派上进行python编程_在树莓派上用Python控制LED
  14. 操作系统(秋招整理)
  15. Python POST登陆linkedin分析(完),完整实现过程
  16. 网银安全控件远程代码执行漏洞分析
  17. 用计算机算出增长比例公式,复合增长率excel公式(年均复合增长率计算器)
  18. SAS学习7(gpolt过程、gchart过程、图形输出、ods功能、假设检验,ttest过程,rank过程,秩和检验(非参数检验))
  19. 贪吃蛇c语言程序 简书,贪吃蛇游戏(scratch编程)
  20. 设备冗余技术——链路聚合

热门文章

  1. 启动子级时出错_减速机安装与使用时需注意的八个要点,细节很重要!
  2. python 实用程序代码_【转】python常用工具代码
  3. 惠普z840工作站linux,全模块战神 惠普旗舰级Z840工作站评测
  4. 为啥我从后台查到的值在页面显示的是undefined_再谈一个管理后台列表功能应有的素质...
  5. 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?
  6. mysql练习题及答案_MySQL经典练习题及答案,常用SQL语句练习50题
  7. 【java】快速复制数组方法arraycopy的使用
  8. Redux 入门教程(一):基本用法
  9. [译] iOS 开发之新版 APNs 搭建必备知识
  10. Bzoj4566:[HAOI2016]找相同字符