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之后,数据已经被数据库自动提交了。
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之后,数据已经被数据库自动提交了。
相关文章推荐
- 论hibernate中的session.flush()和transaction.commit()的差异
- 解决hibernate产生的id序列或者setXX不能同步到数据库到问题(this.hibernateTemplate.flush();hibernateTemplate.getSessionFactory().getCurrentSession().connection().commit())
- Hibernate中 session.getTransaction().commit(); 和session.beginTransaction().commit();
- hibernate session 之flush 和commit 的区别
- [SSH] Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction
- Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition
- hibernate框架中session缓存的flush(),commit(),refresh(),clear()方法
- session.flush与transaction.commit 区别
- hibernate中的session.flush()和commit()的区别
- Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition
- Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definitio
- [hibernate]Turn your Session into FlushMode.COMMIT/AUTO,请教这种配置怎么处理
- Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition
- Hibernate session flush commit
- Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition
- hibernate,session.save(entity)和transaction.commit()
- Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction
- Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition
- 关于Hibernate Could not obtain transaction-synchronized Session for current thread
- spring管理hibernate4 transaction getCurrentSession为什么报错?