Differenza tra save () e saveAndFlush () in Spring Data JPA

1. Panoramica

In questo breve tutorial, discuteremo la differenza tra i metodi save () e saveAndFlush () in Spring Data JPA.

Anche se entrambi questi metodi vengono utilizzati per salvare le entità nel database, esistono alcune differenze fondamentali.

2. Applicazione di esempio

Vediamo prima come utilizzare i metodi save () e saveAndFlush () con un esempio. Come primo passaggio, creiamo una classe di entità:

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

Successivamente, creiamo un repository JPA per le operazioni CRUD sulla classe di entità Employee :

public interface EmployeeRepository extends JpaRepository { }

3. Il metodo save ()

Come indica il nome, il metodo save () ci consente di salvare un'entità nel DB . Appartiene all'interfaccia CrudRepository definita da Spring Data. Vediamo come possiamo usarlo:

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

Normalmente, Hibernate mantiene lo stato persistente in memoria. Il processo di sincronizzazione di questo stato con il database sottostante è chiamato flush.

Quando utilizziamo il metodo save () , i dati associati all'operazione di salvataggio non verranno scaricati nel DB a meno che e fino a quando non viene effettuata una chiamata esplicita al metodo flush () o commit () .

Se usiamo implementazioni JPA come Hibernate, quella specifica implementazione gestirà le operazioni di flush e commit.

Una cosa che dobbiamo tenere a mente qui è che, se decidiamo di svuotare i dati da soli senza eseguirne il commit, le modifiche non saranno visibili alla transazione esterna a meno che non venga effettuata una chiamata di commit in questa transazione o nel livello di isolamento della transazione esterna è READ_UNCOMMITTED .

4. Il metodo saveAndFlush ()

A differenza di save () , il metodo saveAndFlush () scarica i dati immediatamente durante l'esecuzione. Questo metodo appartiene all'interfaccia JpaRepository di Spring Data JPA. Ecco come lo usiamo:

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

Normalmente, utilizziamo questo metodo quando la nostra logica aziendale deve leggere le modifiche salvate in un momento successivo durante la stessa transazione ma prima del commit.

Ad esempio, immagina uno scenario in cui dobbiamo eseguire una stored procedure che si aspetta una proprietà dell'entità, che salveremo. In questo caso, il metodo save () non funzionerà poiché le modifiche non sono sincronizzate con il DB e la procedura memorizzata non è a conoscenza delle modifiche. Il metodo saveAndFlush () è perfettamente adatto per questo tipo di scenario.

5. conclusione

In questo rapido articolo, ci siamo concentrati sulla differenza tra i metodi save () e saveAndFlush () di Spring Data JPA .

Nella maggior parte dei casi, utilizzeremo il metodo save () . Ma occasionalmente, potrebbe essere necessario utilizzare anche il metodo saveAndFlush () per casi d'uso specifici.

Come al solito, il breve esempio di cui abbiamo discusso qui può essere trovato su GitHub.