Unterschied zwischen save () und saveAndFlush () in Spring Data JPA

1. Übersicht

In diesem kurzen Tutorial werden wir den Unterschied zwischen den Methoden save () und saveAndFlush () in Spring Data JPA erläutern .

Obwohl beide Methoden zum Speichern von Entitäten in der Datenbank verwendet werden, gibt es einige grundlegende Unterschiede.

2. Beispielanwendung

Lassen Sie uns zunächst anhand eines Beispiels sehen, wie die Methoden save () und saveAndFlush () verwendet werden. Lassen Sie uns als ersten Schritt eine Entitätsklasse erstellen:

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

Als Nächstes erstellen wir ein JPA-Repository für die CRUD-Operationen für die Entitätsklasse Employee :

public interface EmployeeRepository extends JpaRepository { }

3. Die save () -Methode

Wie der Name schon sagt, können wir mit der Methode save () eine Entität in der Datenbank speichern . Es gehört zur CrudRepository- Schnittstelle, die von Spring Data definiert wird. Mal sehen, wie wir es nutzen können:

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

Normalerweise speichert der Ruhezustand den dauerhaften Zustand im Speicher. Das Synchronisieren dieses Status mit der zugrunde liegenden Datenbank wird als Leeren bezeichnet.

Wenn wir die Methode save () verwenden, werden die mit der Sicherungsoperation verknüpften Daten erst dann in die Datenbank übertragen, wenn ein expliziter Aufruf der Methode flush () oder commit () erfolgt .

Wenn wir JPA-Implementierungen wie Hibernate verwenden, verwaltet diese spezifische Implementierung die Flush- und Commit-Vorgänge.

Eine Sache, die wir hier berücksichtigen müssen, ist, dass, wenn wir uns entscheiden, die Daten selbst zu löschen, ohne sie festzuschreiben, die Änderungen für die externe Transaktion nur sichtbar sind, wenn in dieser Transaktion oder auf der Isolationsstufe ein Festschreibungsaufruf erfolgt der externen Transaktion ist READ_UNCOMMITTED .

4. Die saveAndFlush () Methode

Im Gegensatz zu save () , die saveAndFlush () Methode spült die Daten sofort während der Ausführung. Diese Methode gehört zur JpaRepository- Schnittstelle von Spring Data JPA. So verwenden wir es:

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

Normalerweise verwenden wir diese Methode, wenn unsere Geschäftslogik die gespeicherten Änderungen zu einem späteren Zeitpunkt während derselben Transaktion, jedoch vor dem Festschreiben, lesen muss.

Stellen Sie sich zum Beispiel ein Szenario vor, in dem wir eine gespeicherte Prozedur ausführen müssen, die eine Eigenschaft der Entität erwartet, die wir speichern werden. In diesem Fall funktioniert die save () -Methode nicht, da die Änderungen nicht mit der Datenbank synchronisiert sind und die gespeicherte Prozedur die Änderungen nicht kennt. Die saveAndFlush () -Methode ist perfekt für diese Art von Szenario geeignet.

5. Schlussfolgerung

In diesem kurzen Artikel haben wir uns auf den Unterschied zwischen den Spring Data JPA- Methoden save () und saveAndFlush () konzentriert .

In den meisten Fällen verwenden wir die save () -Methode. Gelegentlich müssen wir jedoch möglicherweise auch die Methode saveAndFlush () für bestimmte Anwendungsfälle verwenden.

Wie üblich finden Sie das kurze Beispiel, das wir hier besprochen haben, auf GitHub.