Spring 数据 jpa 中 save 和 saveAndFlush 的区别

Difference between save and saveAndFlush in Spring data jpa

提问人:Anand 提问时间:1/18/2014 最后编辑:Anand 更新时间:6/27/2023 访问量:194578

问:

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

我遇到了两种方法和. 我不明白这两者之间的区别。在调用时,我的更改也被保存到数据库中,所以有什么用。savesaveAndFlushsavesaveAndFlush

java hibernate spring-data-jpa

评论


答:

180赞 user1918305 1/18/2014 #1

On ,更改将在此命令中立即刷新到数据库。对于 ,这不一定是真的,并且可能只保留在内存中,直到发出 或 命令。saveAndFlushsaveflushcommit

但请注意,即使刷新了事务中的更改并且不提交它们,这些更改仍然不会对外部事务可见,直到在此事务中提交。

在你的例子中,你可能使用某种事务机制,如果一切正常,它会为你发出命令。commit

评论

51赞 Gab是好人 1/31/2017
“在此事务中提交之前,外部事务不可见”这取决于其他事务的隔离级别。如果事务的隔离级别为 READ_UNCOMMITTED,则它将看到其他事务已刷新但尚未提交的内容。
1赞 Satish Patro 11/6/2019
但是,在我的项目中,我使用 save()、saveAll() 并且它持续存在于数据库中,而无需显式调用提交或刷新。那为什么我应该更喜欢 saveAndFlush?FLush 模式,所有这些东西都处于默认模式
1赞 apr 8/19/2020
P Satish Patro,saveAndFlush() 用于即时刷新。如果使用 save(),那么稍后将由 JPA 处理刷新操作。
53赞 Ralf 1/18/2014 #2

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

如果使用刷新模式 AUTO,并且使用应用程序先保存数据,然后再次选择数据,则不会看到 和 之间的差异,因为选择会首先触发刷新。请参阅文档save()saveAndFlush()

评论

0赞 azerafati 7/5/2014
对不起,但是如果我是一个实体并且又是同一个实体,您的意思是第二个命令不会抛出重复异常??savesave
3赞 Ralf 7/6/2014
@Bludream 是的,我的理解是,调用是幂等的。有关更多详细信息,请参阅此线程save
5赞 Dinushika Rathnayake 4/21/2022 #3

这两种方法都用于将实体保存到数据库。刷新是将持久性上下文的状态与基础数据库同步的过程。

使用 saveAndFlush 方法时,数据会立即刷新到数据库,要使用 save 方法,我们需要显式调用 flush() 方法。 使用刷新可以在同一事务期间的后续步骤中读取保存的更改,但在提交之前。所以如果不需要提交,仍然可以回滚

1赞 mahdi rahmani 6/27/2023 #4

“save”方法用于将实体保存到数据库中。调用“save”方法时,实体首先保存到数据库的事务缓冲区,然后在提交事务时将实体保存到数据库中。“save”方法返回保存的实体。

另一方面,“保存并刷新”方法与“保存”执行相同的操作,但还会强制数据库立即将挂起的更改写入磁盘。在需要确保数据立即保存到数据库而不是等待事务提交的情况下,这可能很有用。

总之,Spring Data 中“保存”和“保存并刷新”之间的主要区别在于,后者立即将待处理的更改写入数据库,而前者则等到事务提交后再这样做。

如果要保存一个新实体并在同一事务中使用其 ID,则应使用“save”方法,然后调用“flush”方法。

调用“save”方法时,实体将保存到事务缓冲区中,并为实体分配一个临时 ID。此 ID 由基础持久性框架生成,而不是在将实体保存到数据库时分配给实体的最终 ID。

通过调用“flush”方法,可以强制基础持久性框架立即将挂起的更改写入数据库。这会导致分配给实体的临时 ID 替换为数据库分配的最终 ID。

调用“flush”方法后,您可以在同一事务中安全地使用新保存的实体的 ID。