您的位置:首页 > 其它

Hibernate:session.flush与transaction.commit

2009-08-04 16:26 239 查看

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

方法。

补充:mysql数据库默认情况下是自动提交事务的,也是说当你flush之后,数据已经被数据库自动提交了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐