我试图通过 JpaRepository测试一些 CRUD 操作来学习弹簧数据 JPA。
JpaRepository
我发现了两种方法 save和 saveAndFlush。 我不明白这两者之间的区别。在调用 save时,我的更改也被保存到数据库中,那么 saveAndFlush的用途是什么。
save
saveAndFlush
在 saveAndFlush上,更改将在此命令中立即刷新到 DB。对于 save,这不一定是正确的,可能只是停留在内存中,直到发出 flush或 commit命令。
flush
commit
但是请注意,即使在事务中刷新更改并不提交它们,在此事务中提交之前,外部事务仍然可以看到这些更改。
在您的例子中,您可能使用某种事务机制,如果一切正常,它会发出 commit命令。
取决于您正在使用的休眠刷新模式(默认为 AUTO) ,save可能会也可能不会立即将您的更改写入数据库。当您调用 saveAndFlush时,您正在强制模型状态与数据库的同步。
AUTO
如果使用刷新模式 AUTO 并使用应用程序首先保存数据,然后再次选择数据,则不会看到 save()和 saveAndFlush()之间的行为差异,因为选择首先触发刷新。看看 文件。
save()
saveAndFlush()
在 SpringDataJpasave()方法中,我们可以将一个实体保存到数据库中。它属于 Spring Data 定义的 CrudRepository接口。
CrudRepository
当我们使用 save ()方法时,与 save 操作相关联的数据将不会刷新到 DB,除非并且直到发出了对 ush ()或 commit ()方法的显式调用。
作为示例,让我们创建一个 Entity 和 JPA 存储库。
@Data @Entity public class User{ @Id private Long id; private String name; } public interface UserRepository extends JpaRepository<User, Long> { }
然后可以像这样使用 save()方法,
userRepository.save(new User(1L, "Geeth"));
但 saveAndFlush()方法不同于 save()。saveAndFlush()方法在执行期间立即刷新数据。此方法属于 Spring Data JPA 的 JpaRepository 接口。你可以这样使用它。
userRepository.saveAndFlush(new User(2L, "Sam"));
通常,当我们的业务逻辑需要在稍后的同一事务期间但在提交之前读取保存的更改时,我们使用此方法。
例如,假设有这样一个场景,我们必须执行一个存储过程,该存储过程需要实体的一个属性,我们要保存这个属性。在这种情况下,save ()方法无法工作,因为更改与 DB 不同步,并且存储过程不知道这些更改。SaveAndFlush ()方法非常适合这种场景。
这两种方法都用于将实体保存到数据库中。刷新是将持久化上下文的状态与基础数据库同步的过程。
当使用 拯救和冲洗方法时,数据立即刷新到数据库,为了使用 拯救方法,我们需要显式调用 冲水()方法。 使用刷新可以在同一事务的后续步骤中但在提交之前读取已保存的更改。因此,如果不需要 承诺,仍然可以 回滚。