Diferencia entre save () y saveAndFlush () en Spring Data JPA

1. Información general

En este breve tutorial, vamos a discutir la diferencia entre los métodos save () y saveAndFlush () en Spring Data JPA.

Aunque ambos métodos se utilizan para guardar entidades en la base de datos, existen algunas diferencias fundamentales.

2. Aplicación de ejemplo

Primero veamos cómo usar los métodos save () y saveAndFlush () con un ejemplo. Como primer paso, creemos una clase de entidad:

@Entity public class Employee { @Id private Long id; private String name; // constructors // standard getters and setters }

A continuación, creemos un repositorio JPA para las operaciones CRUD en la clase de entidad Empleado :

public interface EmployeeRepository extends JpaRepository { }

3. El método save ()

Como su nombre lo indica, el método save () nos permite guardar una entidad en la base de datos . Pertenece a la interfaz CrudRepository definida por Spring Data. Veamos cómo podemos usarlo:

employeeRepository.save(new Employee(1L, "John"));

Normalmente, Hibernate mantiene el estado persistente en la memoria. El proceso de sincronizar este estado con la base de datos subyacente se denomina lavado.

Cuando utilizamos el método save () , los datos asociados con la operación de guardar no se descargarán en la base de datos a menos que y hasta que se realice una llamada explícita al método flush () o commit () .

Si usamos implementaciones JPA como Hibernate, entonces esa implementación específica administrará las operaciones de descarga y confirmación.

Una cosa que debemos tener en cuenta aquí es que, si decidimos vaciar los datos por nosotros mismos sin comprometerlos, los cambios no serán visibles para la transacción externa a menos que se realice una llamada de confirmación en esta transacción o en el nivel de aislamiento. de la transacción externa es READ_UNCOMMITTED .

4. El saveAndFlush () Método

A diferencia de save () , el método saveAndFlush () vacía los datos inmediatamente durante la ejecución. Este método pertenece a la interfaz JpaRepository de Spring Data JPA. Así es como lo usamos:

employeeRepository.saveAndFlush(new Employee(2L, "Alice"));

Normalmente, usamos este método cuando nuestra lógica de negocios necesita leer los cambios guardados en un momento posterior durante la misma transacción pero antes de la confirmación.

Por ejemplo, imagina un escenario en el que tenemos que ejecutar un procedimiento almacenado que espera una propiedad de la entidad, que vamos a guardar. En este caso, el método save () no funcionará ya que los cambios no están sincronizados con la base de datos y el procedimiento almacenado no conoce los cambios. El método saveAndFlush () se adapta perfectamente a este tipo de escenario.

5. Conclusión

En este artículo rápido, nos centramos en la diferencia entre los métodos save () y saveAndFlush () de Spring Data JPA .

En la mayoría de los casos, usaremos el método save () . Pero ocasionalmente, es posible que necesitemos usar el método saveAndFlush () también para casos de uso específicos.

Como de costumbre, el breve ejemplo que hemos discutido aquí se puede encontrar en GitHub.