session.flush()、transaction.commit、session.close()

以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方法。

   

     在session.close()里会自动调用flush(),而flush()又可以“把sql语句发送到数据库”。但是“数据库没有反应”。

 



1、session在什么情况下清理缓存:
* 默认情况下,当应用程序提交事务,如:Transaction.commit;
* 当我们显示调用flush的时候
* 在执行某些查询的时候,如:iterate

2、session.flush()主要完成两件事情:
* 清理缓存
* 执行sql

3、flush执行的顺序:hibernate按照save,update,delete顺序提交相关操作

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值