以session的save方法为例来看一个简单、完整的事务流程,如下是代码片段:

…………………………………………………………………………

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

session.save(customer);//之前已实例化好了的一个对象

tx.commit();

…………………………………………………………………………

示例很简单,就是向数据库中插入一条顾客信息,这是一个最简单的数据库事务。在这个简单的过程中,Hibernate为我们做了一些什么事情呢?为了更好的观察,我们将Hibernate的”show_sql”属性设置为true,然后运行我们的程序,控制台打印出如下信息:

Hibernate: select max(ID) from CUSTOMER

Hibernate: insert into CUSTOMER (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, description, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

这里也许看不出什么端倪来,现在在session.save(customer)后面加一行代码,输出这个customer的OID,System.out.println(customer.getId()),再次运行程序,控制台输出为:

Hibernate: select max(ID) from CUSTOMER

22

Hibernate: insert into CUSTOMER (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, description, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

OID在insert语句之前输出,这可以说明两个问题:1.insert语句并不是在执行save的时候发送给数据库的;2.insert语句是在执行commit的时候发送给数据库的。结合前面我们所说过的:执行save的时候,Hibernate会首先把对象放入缓存,然后计划一条insert语句。一个基本的插入流程就出来了:

1.  判断所要保存的实例是否已处于持久化状态,如果不是,则将其置入缓存;

2.  根据所要保存的实例计划一条insert sql语句,注意只是计划,并不执行;

3.  事务提交时执行之前所计划的insert语句;

后台还打印出了select max(ID) from CUSTOMER,这主要是为了给customer赋予一个OID,因为一般情况下临时对象的OID是NULL。

接着我们做两个测试:

1.  将tx.commit();注释掉,此时控制台没有打印出insert语句;

2.  将tx.commit()换成session.flush,此时控制太打印出了insert语句,但是数据库中并没有添加新的记录;

通过查阅Hibernate的API可以知道flush方法的主要作用就是清理缓存,强制数据库

与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据库发送一系列的sql语句,并执行这些sql语句,但是不会向数据库提交。而commit方法则会首先调用flush方法,然后提交事务。这就是为什么我们仅仅调用flush的时候记录并未插入到数据库中的原因,因为只有提交了事务,对数据库所做的更新才会被保存下来。因为commit方法隐式的调用了flush,所以一般我们都不会显示的调用flush方法。

最新文章

  1. dataset 修改小数点位数
  2. verilog断言(SVA:systemverlog assertion)语法 ---- 转载
  3. Autofac - 服务
  4. 东大OJ-快速排序
  5. 【Sharing】开发与研发
  6. PHP练习题(二)
  7. CentOS6.5使用本地光盘做yum源 (参考:http://www.jb51.net/os/RedHat/43343.html)
  8. 汇编指令-CMP、TEQ(5)
  9. 从DDD开始说起
  10. 使用elk转存储日志
  11. Vue中的$set的使用
  12. Maven打包详细流程
  13. 无法启动 Maya 集成的 qt designer 的解决方法和原因 以及 中英文切换
  14. 坑!vue.js在ios9中失效
  15. 【FastDFS】FastDFS在CentOS的搭建
  16. 安装gensim报错:Original error was: DLL load failed: 找不到指定的模块。 Command "python setup.py egg_info" failed with error code 1 in C:\Users\xubing\AppData\Local\Temp\pip-install-nta89iep\gensim\
  17. 把一个集合自定转成json字符串
  18. selenium 各种很奇葩的异常
  19. 转载:Mongodb start
  20. “全栈2019”Java第八十三章:内部类与接口详解

热门文章

  1. 基于SSM酒店管理系统mysql版本(前后台)
  2. CocoaPods 私有化
  3. HTML5-CSS(一)
  4. etcd学习(3)-grpc使用etcd做服务发现
  5. vue(24)网络请求模块axios使用
  6. ssm框架下 数据库连接异常 java.sql.SQLException: The server time zone value '???ú±ê×??±??' is unrecognized or represents more
  7. odoo时间过滤
  8. Vue 2升级 Vue 3初探小细节
  9. Java大整形BigInteger的用法
  10. Tomcat 性能监控与优化