我是hibernate的新手。我对交易和冲洗有疑问。
每当我们想要持久化对象时,我们就会打开一个会话并开始一个事务。坚持其中一个先来,另一个先来......
1)session.getTransaction.commit(); 2)调用Session.flush()
根据我读过的内容,commit()将值提交给数据库。 flush()将对象状态同步到数据库。
这两者之间有什么区别。
答案 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}}之前隐式执行。