博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate学习(七):session.flush与transaction.commit
阅读量:7234 次
发布时间:2019-06-29

本文共 1715 字,大约阅读时间需要 5 分钟。

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

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

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

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

tx.commit();

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

示例很简单,就是向数据库中插入一条顾客信息,这是一个最简单的数据库事务。在这个简单的过程中,Hibernate为我们做了一些什么事情呢?为了更好的观察,我们将Hibernateshow_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)后面加一行代码,输出这个customerOIDSystem.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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

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

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

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

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

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

接着我们做两个测试:

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

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

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

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

本文转自 646676684 51CTO博客,原文链接:http://blog.51cto.com/2402766/615969,如需转载请自行联系原作者
你可能感兴趣的文章
手把手教你搭建智能合约测试环境、开发、编译、部署以及如何通过JS调用合约方法...
查看>>
Flex 布局教程
查看>>
固定宽度布局开发WebApp如何实现多终端下自适应?
查看>>
伟大的Scrum团队的特征
查看>>
2019春节防坑指南之抢票陷阱(文末有彩蛋)
查看>>
深入node.js-浏览器缓存机制
查看>>
解决IOS中input失焦后,页面上移,点击不了问题
查看>>
【C】 23_#error 和 #line 使用分析
查看>>
浅谈 Java 10 ,你可能不知道的五件事
查看>>
IT 人能在一线城市里生活一辈子吗?
查看>>
VUE的总结(1)
查看>>
【PWA学习与实践】(5)在Web中进行服务端消息推送
查看>>
WebAssembly完全入门——了解wasm的前世今身
查看>>
SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI
查看>>
SAP Cloud for Customer Extensibility的设计与实现
查看>>
Nacos 发布0.3.0版本,迄今为止最好看的版本
查看>>
如何愉快的在PhpStorm中进行PHPUnit单元测试和Xdebug断点调试?
查看>>
Pod Preset玩转K8S容器时区自动配置
查看>>
PHP多进程初探 --- 进程间通信二三事
查看>>
[源码阅读]解析Anime(JS动画库)核心(1)
查看>>