Hibernate学习(七):session.flush与transaction.commit
来源:互联网 发布:甲醛冬天会挥发吗 知乎 编辑:程序博客网 时间:2024/05/17 00:52
以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方法。
- Hibernate学习(七):session.flush与transaction.commit
- Hibernate学习(七):session.flush与transaction.commit
- Hibernate:session.flush与transaction.commit
- session.flush与transaction.commit 区别
- 论hibernate中的session.flush()和transaction.commit()的差异
- Hibernate session flush commit
- hibernate flush与commit
- hibernate,session.save(entity)和transaction.commit()
- hibernate中的session.flush()和commit()的区别
- hibernate commit和flush
- HIbernate commit() and flush()
- Hibernate中的Session与Transaction
- Hibernate—session与transaction
- Hibernate中的 Session 与Transaction
- Hibernate 学习笔记1 session flush
- Hibernate的FlushMode与session.flush()
- 【Hibernate】(2)Hibernate配置与session、transaction
- Hibernate session.flush方法
- 我之理解--Java_Thread_1
- SIP和VoIP协议及其应用
- 关于在Ubuntu中无法打开OpenOffice的解决方法
- Write-Error 帮助信息
- ImportExportFavorites 函数被微软干掉了
- Hibernate学习(七):session.flush与transaction.commit
- Write-Debug 帮助信息
- Google黑板报RSS订阅后在Outlook日期无效
- PROJECT SERVER安装部署FAQ[转载]
- 电脑故障续
- 在 Cygwin B20 环境中使用中文
- 被人拒绝的时候也就是你成熟的时候!
- 【我眼中周星驰最经典的十大影片】之首【喜剧之王】
- Java泛型九诫