关于hibernate事务和flush

时间:2012-03-31 06:07:52

标签: hibernate

我是hibernate的新手。我对交易和冲洗有疑问。

每当我们想要持久化对象时,我们就会打开一个会话并开始一个事务。坚持其中一个先来,另一个先来......

1)session.getTransaction.commit(); 2)调用Session.flush()

根据我读过的内容,commit()将值提交给数据库。 flush()将对象状态同步到数据库。

这两者之间有什么区别。

1 个答案:

答案 0 :(得分:8)

session.flush()将执行刷新过程,该过程是关于对hibernate会话管理的所有持久对象进行脏检查。如果一个对象被认为是脏的(即该hibernate会话中存储的对象的任何值都是与数据库中的相应记录不同),hibernate会立即向DB发出UPDATE SQL,以便同步这些差异,使得存储在hibernate会话中的对象与相应的数据库记录具有相同的值。

但是,仅发出UPDATE SQL并不意味着修改后的数据实际上已保存到DB中,您必须COMMIT该事务以确认实际将修改后的数据保存到DB。这也意味着您可以ROLLBACK如果在发出UPDATE SQL之后但在提交事务之前发现任何错误,则UPDATE SQL所做的更改。

休眠会话的刷新行为由FlushMode参数确定,FlushMode.AUTO参数可由session.setFlushMode()配置。默认值为session.flush(),以便在提交事务和执行查询之前自动发生session.getTransaction.commit()

因此,在默认FlushMode中调用session.flush()时,session.getTransaction.commit()将在执行{{1}}之前隐式执行。