我试图通过JpaRepository测试一些CRUD操作来学习spring数据JPA。我遇到了两个方法save和saveAndFlush。我不明白这两者之间的区别。在调用save时,我的更改也被保存到数据库中,那么saveAndFlush有什么用呢?
JpaRepository
save
saveAndFlush
7gyucuyw1#
在saveAndFlush上,更改将在此命令中立即刷新到DB。对于save,这并不一定是真的,并且可能仅保留在内存中,直到发出flush或commit命令。但是要注意,即使你刷新了事务中的更改并且没有提交它们,这些更改仍然不会对外部事务可见,直到在这个事务中提交。在您的例子中,您可能使用某种事务机制,如果一切正常,它会为您发出commit命令。
flush
commit
oug3syen2#
根据您使用的休眠刷新模式(默认为AUTO),save可能会也可能不会将您的更改直接写入数据库。当您调用saveAndFlush时,您将强制模型状态与DB同步。如果使用刷新模式AUTO,并且使用应用程序首先保存数据,然后再次选择数据,则不会看到save()和saveAndFlush()之间的bahvior差异,因为选择会首先触发刷新。请参阅文档。
AUTO
save()
saveAndFlush()
6fe3ivhb3#
这两种方法都用于将实体保存到数据库中。刷新是将持久性上下文的状态与基础数据库同步的过程。当使用saveAndFlush方法时,数据会立即刷新到数据库中,而要使用save方法进行刷新,我们需要显式调用flush()方法。使用刷新可以在同一事务期间但在提交之前的稍后步骤读取保存的更改。所以如果不需要提交,仍然可以回滚。
c0vxltue4#
“保存”方法用于将实体保存到数据库。当调用“保存”方法时,实体首先被持久化到数据库的事务缓冲区,然后,当事务被提交时,实体被保存到数据库。“保存”方法返回保存的实体。另一方面,“保存and flush”方法与“save”方法执行相同的操作,但另外强制数据库立即将挂起的更改写入磁盘。这在需要确保数据立即持久化到数据库而不是等待事务提交的情况下非常有用。总而言之,Spring Data中的“保存”和“save and flush”之间的主要区别在于后者立即将挂起的更改写入数据库,而前者等到事务提交才这样做。如果要保存新实体并在同一事务中使用其ID,则应使用“save”方法,然后调用“flush”方法。当您调用“保存”方法时,实体将持久化到事务缓冲区,并为实体分配一个临时ID。此ID由底层持久性框架生成,并不是将实体保存到数据库时分配给实体的最终ID。通过调用“flush”方法,可以强制底层持久性框架立即将挂起的更改写入数据库。这将导致分配给实体的临时ID被数据库分配的最终ID替换。一旦调用了“flush”方法,就可以在同一事务中安全地使用新保存的实体的ID。
4条答案
按热度按时间7gyucuyw1#
在
saveAndFlush
上,更改将在此命令中立即刷新到DB。对于save
,这并不一定是真的,并且可能仅保留在内存中,直到发出flush
或commit
命令。但是要注意,即使你刷新了事务中的更改并且没有提交它们,这些更改仍然不会对外部事务可见,直到在这个事务中提交。
在您的例子中,您可能使用某种事务机制,如果一切正常,它会为您发出
commit
命令。oug3syen2#
根据您使用的休眠刷新模式(默认为
AUTO
),save
可能会也可能不会将您的更改直接写入数据库。当您调用saveAndFlush
时,您将强制模型状态与DB同步。如果使用刷新模式AUTO,并且使用应用程序首先保存数据,然后再次选择数据,则不会看到
save()
和saveAndFlush()
之间的bahvior差异,因为选择会首先触发刷新。请参阅文档。6fe3ivhb3#
这两种方法都用于将实体保存到数据库中。刷新是将持久性上下文的状态与基础数据库同步的过程。
当使用saveAndFlush方法时,数据会立即刷新到数据库中,而要使用save方法进行刷新,我们需要显式调用flush()方法。使用刷新可以在同一事务期间但在提交之前的稍后步骤读取保存的更改。所以如果不需要提交,仍然可以回滚。
c0vxltue4#
“保存”方法用于将实体保存到数据库。当调用“保存”方法时,实体首先被持久化到数据库的事务缓冲区,然后,当事务被提交时,实体被保存到数据库。“保存”方法返回保存的实体。
另一方面,“保存and flush”方法与“save”方法执行相同的操作,但另外强制数据库立即将挂起的更改写入磁盘。这在需要确保数据立即持久化到数据库而不是等待事务提交的情况下非常有用。
总而言之,Spring Data中的“保存”和“save and flush”之间的主要区别在于后者立即将挂起的更改写入数据库,而前者等到事务提交才这样做。
如果要保存新实体并在同一事务中使用其ID,则应使用“save”方法,然后调用“flush”方法。
当您调用“保存”方法时,实体将持久化到事务缓冲区,并为实体分配一个临时ID。此ID由底层持久性框架生成,并不是将实体保存到数据库时分配给实体的最终ID。
通过调用“flush”方法,可以强制底层持久性框架立即将挂起的更改写入数据库。这将导致分配给实体的临时ID被数据库分配的最终ID替换。
一旦调用了“flush”方法,就可以在同一事务中安全地使用新保存的实体的ID。