Unterschied zwischen save und saveAndFlush in Spring data jpa

Lesezeit: 4 Minuten

Benutzer-Avatar
Anand

Ich versuche, Spring Data JPA zu lernen, indem ich einige CRUD-Operationen über teste JpaRepository.

Dabei bin ich auf zwei Methoden gestoßen save und saveAndFlush. Ich verstehe den Unterschied zwischen diesen beiden nicht. Beim Anrufen save Auch meine Änderungen werden in der Datenbank gespeichert, also was nützt es saveAndFlush.

Benutzer-Avatar
Benutzer1918305

An saveAndFlush, werden Änderungen in diesem Befehl sofort in die DB geschrieben. Mit savedas ist nicht unbedingt wahr und bleibt vielleicht nur in Erinnerung, bis flush oder commit Befehle werden ausgegeben.

Beachten Sie jedoch, dass die Änderungen auch dann noch vorhanden sind, wenn Sie die Änderungen in der Transaktion löschen und nicht festschreiben Gewohnheit bis zum Festschreiben in dieser Transaktion für die externen Transaktionen sichtbar sein.

In Ihrem Fall verwenden Sie wahrscheinlich eine Art Transaktionsmechanismus, der Probleme verursacht commit Befehl für Sie, wenn alles gut geht.

  • “wird für externe Transaktionen nicht sichtbar sein, bis der Commit in dieser Transaktion erfolgt ist” Dies hängt von der Isolationsstufe der anderen Transaktionen ab. Wenn die Isolationsstufe einer Transaktion READ_UNCOMMITTED ist, wird sie sehen, was geleert, aber noch nicht von anderen Transaktionen festgeschrieben wurde.

    – Gab是好人

    31. Januar 2017 um 9:46 Uhr


  • aber in meinem Projekt verwende ich save (), saveAll () und es bleibt in der DB bestehen, ohne dass explizit ein Commit oder Flush aufgerufen wird. Warum sollte ich dann saveAndFlush bevorzugen? FLush-Modus Alle diese Dinge sind im Standardmodus

    – Satish Patro

    6. November 2019 um 3:19 Uhr


  • P Satish Patro, saveAndFlush() wird zum sofortigen Flushen verwendet. Wenn Sie save() verwenden, wird die Flush-Aktion später von JPA behandelt.

    – Apr

    19. August 2020 um 7:37 Uhr

Benutzer-Avatar
Ralf

Abhängig von dem von Ihnen verwendeten Ruhezustandsspülmodus (AUTO ist die Vorgabe) save kann Ihre Änderungen sofort in die DB schreiben oder auch nicht. Wenn du anrufst saveAndFlush Sie erzwingen die Synchronisierung Ihres Modellzustands mit der DB.

Wenn Sie den Spülmodus AUTO verwenden und Ihre Anwendung verwenden, um die Daten zuerst zu speichern und dann erneut auszuwählen, werden Sie keinen Unterschied im Verhalten zwischen feststellen save() und saveAndFlush() weil die Auswahl zuerst einen Flush auslöst. Siehe die Dokumentation.

  • sorry aber wenn ich save eine Entität und wieder die gleiche, du meinst mit save Der zweite Befehl löst zum Beispiel keine Ausnahme für die Duplizierung aus.

    – aserafati

    5. Juli 2014 um 12:23 Uhr

  • @Bludream Ja, das ist mein Verständnis, das anruft save sind idempotent. Siehe diesen Thread für weitere Details.

    – Ralf

    6. Juli 2014 um 7:30 Uhr


Beide Methoden werden verwendet, um Entitäten in der Datenbank zu speichern. Flushing ist der Prozess der Synchronisierung des Zustands des Persistenzkontexts mit der zugrunde liegenden Datenbank.

Beim Benutzen saveAndFlush Methode, Daten sofort in die Datenbank spülen und es mit dem zu tun sparen Methode, die wir aufrufen müssen spülen() Methode explizit. Durch die Verwendung von flush können gespeicherte Änderungen in einem späteren Schritt während derselben Transaktion, jedoch vor dem Commit, gelesen werden. Kann also noch Zurückrollen wenn nicht nötig verpflichten.

Im Frühjahr Data Jpa save() -Methode ermöglicht es uns, eine Entität in der DB zu speichern. Es gehört zu den CrudRepository von Spring Data definierte Schnittstelle.

Wenn wir die save()-Methode verwenden, werden die mit der save-Operation verknüpften Daten nicht in die DB geleert, es sei denn, und bis ein expliziter Aufruf der flush()- oder commit()-Methode erfolgt.

Lassen Sie uns als Beispiel ein Entity- und JPA-Repository erstellen.

@Data
@Entity
public class User{

    @Id
    private Long id;
    private String name;
}


public interface UserRepository extends JpaRepository<User, Long> {
}

Dann kann verwendet werden save() Methode wie diese,

userRepository.save(new User(1L, "Geeth"));

Aber saveAndFlush() Methode anders save(). Das saveAndFlush() -Methode löscht die Daten sofort während der Ausführung. Diese Methode gehört zur JpaRepository-Schnittstelle von Spring Data JPA. Sie können es wie folgt verwenden.

userRepository.saveAndFlush(new User(2L, "Sam"));

Normalerweise verwenden wir diese Methode, wenn unsere Geschäftslogik die gespeicherten Änderungen zu einem späteren Zeitpunkt während derselben Transaktion, aber 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 Methode save() nicht, da die Änderungen nicht mit der Datenbank synchron sind und die gespeicherte Prozedur nichts von den Änderungen weiß. Die Methode saveAndFlush() ist für diese Art von Szenario perfekt geeignet.

1343350cookie-checkUnterschied zwischen save und saveAndFlush in Spring data jpa

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy