一、主要区别

  • saveAndFlush() 上,此命令中的更改将立即刷新到DB。
  • 使用 save() ,就不一定了,它可能只暂时保留在内存中,直到发出flush或commit命令。但是要注意的是,即使在事务中刷新了更改但是未提交它们,这些更改对于外部事务仍然不可见,直到,提交这个事务。

二、场景举例

比如在我们得项目中,保存一条数据后,我又想立马用到这条数据得id,因为实体类是配置了uuid自动生成,所以使用 saveAndFlush() 方法就可以立即获取到这条数据得id。但是如果用 sava() 方法,你不 flush 或者 commit ,你得数据是暂时只在内存中保存,所以此时这条数据是没有主键id的。

提交事务后数据插入进数据库,要想在事务提交之前避免缓存插入数据库需要在执行完 save() 操作调用 flush() 方法或者直接执行 saveAndFlush() 方法即可。

三、注意点(坑)

1.问题说明

在使用 save() 更新的时候,发生改变的字段会更新,没发生改变的会置为空。
如何理解这句话呢?

其实 save() 方法,就是直接保存一个对象。分为两种情况:

  1. 你要保存的对象对应的一条数据在数据库中并不存在,那么将会直接将这条数据保存入数据库。.
  2. 数据库已经有此ID 的数据,并且这条数据有十个字段。其中的五个字段已经有值了。现在要通过 save() 方法进行操作,更新这条数据其中的一个值,但是这个对象除了要更新的值对应的属性有值外,其他的属性都没有值,我们直接用 save() 后,会要更新的值更新了,但是本来有值的几个字段没有了(变成null)。这不是我们想要的结果。

2.解决方案

请查看以下这篇文章。
SpringDataJpa中实现null不更新的解决方案

随着最近Spring Data JPA 使用的越来越多,觉得有些问题还是需要记录一下的。一、主要区别在saveAndFlush()上,此命令中的更改将立即刷新到DB。使用save(),就不一定了,它可能只暂时保留在内存中,直到发出flush或commit命令。但是要注意的是,即使在事务中刷新了更改但是未提交它们,这些更改对于外部事务仍然不可见,直到,提交这个事务。二、场景举例比如...
Spring - Data - Jpa 保存时save和saveAnd Flush 区别 Jpa 是我们经常用到的ORM框架,使用它可以快速便捷的操作数据库,那么它有一个保存方法,你肯定不会陌生,就是save方法和saveAnd Flush ,这两个方法可能会经常用到,那么什么时候使用save方法,什么时候使用saveAnd Flush 呢,下面就进行简单总结一下。 Jpa save 首先创建一个表,进行完整的代码演示。 -- auto-generated definition create table t_user
On saveAnd Flush , changes will be flush ed to DB immediately in this command. With save, this is not necessarily true, and might stay just in memory, until flush or commit commands are issued. 在saveAn...
当instert时,会立即执行sql(但在commit之前仍然看不到数据)。 其他事务无法update同一行,即使set相同id,最后会以id+1的结果insert一条数据。可能跟事务的隔离级别有关。 当update时,不会立即执行sql,console不会打印sql。 其他事务可以update同一行数据。 saveAnd Flush 当update时 当想要update数据时候,数据库会加上行锁。 其他事务会卡住无法及时commit。 自定义的update语句 会立即执行sql。不需要