我正在尝试通过测试 JpaRepository
上的一些 CRUD 操作来学习 spring data JPA。
我遇到了两个方法 save
和 saveAndFlush
。
我不明白这两者之间的区别。在调用 save
时,我的更改也被保存到数据库中,那么使用 saveAndFlush
的意义是什么。
我正在尝试通过测试 JpaRepository
上的一些 CRUD 操作来学习 spring data JPA。
我遇到了两个方法 save
和 saveAndFlush
。
我不明白这两者之间的区别。在调用 save
时,我的更改也被保存到数据库中,那么使用 saveAndFlush
的意义是什么。
saveAndFlush
时,更改会立即刷新到数据库中。而使用save
则不一定如此,更改有可能只停留在内存中,直到发布flush
或commit
命令为止。commit
命令。根据您使用的 Hibernate 刷新模式 (默认为 AUTO
),save
可能会直接将更改写入数据库,也可能不会。当您调用 saveAndFlush
时,您正在强制同步模型状态与数据库。
如果您使用 AUTO 刷新模式,并使用应用程序先保存数据,然后再选择数据,那么在 save()
和 saveAndFlush()
之间的行为上,您将看不到任何差异,因为选择操作首先触发了刷新。请参见文档。
这两种方法都用于将实体保存到数据库。刷新是将持久化上下文的状态与底层数据库同步的过程。
使用saveAndFlush方法时,数据会立即刷新到数据库中。如果使用save方法,我们需要明确调用flush()方法才能进行刷新。 使用flush可以在事务提交之前的同一步骤中读取已保存的更改。因此,如果不需要提交,仍然可以进行回滚操作。
通过调用"flush"方法,您可以强制底层持久化框架立即将待处理的更改写入数据库。这将导致实体的临时ID被数据库分配的最终ID替换。
一旦调用了"flush"方法,在同一事务中您可以安全地使用新保存实体的ID。
save()
方法允许我们将实体保存到数据库中。它属于Spring Data定义的CrudRepository
接口。@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"));