Diferença entre save () e saveAndFlush () no Spring Data JPA

Diferença entre save () e saveAndFlush () no Spring Data JPA

1. Visão geral

Neste breve tutorial, vamos discutir a diferença entre os métodossave()esaveAndFlush() emSpring Data JPA.

Embora esses dois métodos sejam usados ​​para salvar entidades no banco de dados, existem algumas diferenças fundamentais.

2. Exemplo de aplicação

Vamos primeiro ver como usar os métodossave() andsaveAndFlush() com um exemplo. Como uma primeira etapa, vamos criar uma classe de entidade:

@Entity
public class Employee {

    @Id
    private Long id;
    private String name;

    // constructors
    // standard getters and setters
}

A seguir, vamos criar umJPA repository para as operações CRUD na classe de entidadeEmployee:

public interface EmployeeRepository extends JpaRepository {
}

3. O Métodosave()

Como o nome indica, o métodosave() nos permitesave an entity to the DB. Ele pertence à interfaceCrudRepository definida pelo Spring Data. Vamos ver como podemos usá-lo:

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

Normalmente, o Hibernate mantém o estado persistente na memória. O processo de sincronização desse estado com o banco de dados subjacente é chamado liberação.

Quando usamos o métodosave(),the data associated with the save operation will not be flushed to the DB unless and until an explicit call to flush()or commit() method is made.

Se usarmos implementações JPA como o Hibernate, essa implementação específica gerenciará as operações de liberação e confirmação.

Uma coisa que devemos ter em mente aqui é que, se decidirmos liberar os dados por nós mesmos sem confirmá-los, então as mudanças não serão visíveis paratransaction externos a menos que uma chamada de confirmação seja feita nesta transação ou o nível de isolamento da transação externa éREAD_UNCOMMITTED.

4. O MétodosaveAndFlush()

Ao contrário desave(), o métodosaveAndFlush()flushes the data immediately during the execution. Este método pertence à interfaceJpaRepository do Spring Data JPA. É assim que o usamos:

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

Normalmente, usamos esse método quando nossa lógica de negócios precisa ler as alterações salvas posteriormente, durante a mesma transação, mas antes da confirmação.

Por exemplo, imagine um cenário onde temos que executar um procedimento armazenado que espera uma propriedade da entidade, que vamos salvar. Nesse caso, o métodosave() não funcionará, pois as alterações não estão em sincronia com o banco de dados e o procedimento armazenado não sabe sobre as alterações. O métodosaveAndFlush() é perfeitamente adequado para esse tipo de cenário.

5. Conclusão

Neste artigo rápido, focamos na diferença entre os métodossave()esaveAndFlush() do Spring Data JPA.

Na maioria dos casos, usaremos o métodosave(). Mas, ocasionalmente, podemos precisar usar o métodosaveAndFlush() também para casos de uso específicos.

Como de costume, o breve exemplo que discutimos aqui pode ser encontradoover on Github.