提问人:Anand 提问时间:1/18/2014 最后编辑:Anand 更新时间:6/27/2023 访问量:194578
Spring 数据 jpa 中 save 和 saveAndFlush 的区别
Difference between save and saveAndFlush in Spring data jpa
问:
我正在尝试通过测试一些 CRUD 操作来学习 spring 数据 JPA。JpaRepository
我遇到了两种方法和.
我不明白这两者之间的区别。在调用时,我的更改也被保存到数据库中,所以有什么用。save
saveAndFlush
save
saveAndFlush
答:
On ,更改将在此命令中立即刷新到数据库。对于 ,这不一定是真的,并且可能只保留在内存中,直到发出 或 命令。saveAndFlush
save
flush
commit
但请注意,即使刷新了事务中的更改并且不提交它们,这些更改仍然不会对外部事务可见,直到在此事务中提交。
在你的例子中,你可能使用某种事务机制,如果一切正常,它会为你发出命令。commit
评论
根据您使用的休眠刷新模式(默认设置),可能会也可能不会立即将更改写入数据库。调用时,将强制执行模型状态与数据库的同步。AUTO
save
saveAndFlush
如果使用刷新模式 AUTO,并且使用应用程序先保存数据,然后再次选择数据,则不会看到 和 之间的差异,因为选择会首先触发刷新。请参阅文档。save()
saveAndFlush()
评论
save
save
这两种方法都用于将实体保存到数据库。刷新是将持久性上下文的状态与基础数据库同步的过程。
使用 saveAndFlush 方法时,数据会立即刷新到数据库,要使用 save 方法,我们需要显式调用 flush() 方法。 使用刷新可以在同一事务期间的后续步骤中读取保存的更改,但在提交之前。所以如果不需要提交,仍然可以回滚。
“save”方法用于将实体保存到数据库中。调用“save”方法时,实体首先保存到数据库的事务缓冲区,然后在提交事务时将实体保存到数据库中。“save”方法返回保存的实体。
另一方面,“保存并刷新”方法与“保存”执行相同的操作,但还会强制数据库立即将挂起的更改写入磁盘。在需要确保数据立即保存到数据库而不是等待事务提交的情况下,这可能很有用。
总之,Spring Data 中“保存”和“保存并刷新”之间的主要区别在于,后者立即将待处理的更改写入数据库,而前者则等到事务提交后再这样做。
如果要保存一个新实体并在同一事务中使用其 ID,则应使用“save”方法,然后调用“flush”方法。
调用“save”方法时,实体将保存到事务缓冲区中,并为实体分配一个临时 ID。此 ID 由基础持久性框架生成,而不是在将实体保存到数据库时分配给实体的最终 ID。
通过调用“flush”方法,可以强制基础持久性框架立即将挂起的更改写入数据库。这会导致分配给实体的临时 ID 替换为数据库分配的最终 ID。
调用“flush”方法后,您可以在同一事务中安全地使用新保存的实体的 ID。
评论