Spring Data JPA中save和saveAndFlush之间的区别


131

我正在尝试通过测试一些CRUD操作来学习spring数据JPA JpaRepository

我碰到两个方法savesaveAndFlush。我看不出两者之间的区别。在调用时,save我的更改也将保存到数据库中,所以的用途是什么saveAndFlush

Answers:


139

在上saveAndFlush,此命令将立即将更改刷新到DB。使用save,不一定是正确的,它可能只保留在内存中,直到flushcommit发出命令。

但是请注意,即使您刷新了事务中的更改并且不提交它们,这些更改对于外部事务仍然是可见的,直到对该事务中的提交为止。

在您的情况下,您可能使用某种事务处理机制,commit如果一切正常,它将为您发出命令。


35
“直到在此事务中提交后,外部事务才可见” 这取决于其他事务的隔离级别。如果事务的隔离级别为READ_UNCOMMITTED,则它将看到已刷新但其他事务尚未提交的内容。
加布是好人2017年

1
但是,在我的项目中,我使用save(),saveAll()及其在数据库中持久保存,而无需显式提交或刷新调用。那我为什么还要选择saveAndFlush?FLush模式下所有这些东西都处于默认模式下
P Satish Patro

37

根据您使用的休眠刷新模式(AUTO默认设置),save可能会或可能不会立即将更改直接写入数据库。调用时,saveAndFlush您将强制模型状态与数据库同步。

如果您使用冲洗模式AUTO,并且正在使用应用程序先保存然后再次选择数据,则您save()和两者之间的行为不会有差异,saveAndFlush()因为选择首先触发冲洗。请参阅文档


抱歉,但是如果我save又是一个实体,那么您的意思save是第二个命令不会抛出重复异常。例如?
azerafati 2014年

3
@Bludream是的,据我了解,对的调用save是幂等的。有关更多详细信息,请参见此线程
拉尔夫2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.