it-swarm.com.de

Was ist die Verwendung von session.flush () im Ruhezustand

Wenn wir einen Datensatz aktualisieren, können wir session.flush() mit Hibernate verwenden. Was ist die Notwendigkeit für flush()?

89
CHANTI

Das Leeren der Sitzung zwingt den Ruhezustand, den speicherinternen Zustand von Session mit der Datenbank zu synchronisieren (d. H. Um Änderungen in die Datenbank zu schreiben). Standardmäßig wird der Ruhezustand automatisch für Sie gelöscht:

  • vor einigen Abfrageausführungen 
  • wenn eine Transaktion festgeschrieben ist

Wenn Sie Session explizit leeren, erhalten Sie eine genauere Kontrolle, die unter Umständen erforderlich ist (um eine ID zugewiesen zu bekommen, um die Größe der Sitzung zu steuern, ...).

119
Pascal Thivent

Wie in den obigen Antworten richtig gesagt, erzwingen wir durch den Aufruf von flush() den Ruhezustand, um die SQL-Befehle für die Datenbank auszuführen. Aber verstehen Sie, dass Änderungen noch nicht "festgelegt" sind. Wenn Sie also nach dem Flushen und vor dem Festschreiben direkt auf die Datenbank zugreifen (z. B. von der SQL-Eingabeaufforderung) und die geänderten Zeilen überprüfen, werden die Änderungen NICHT angezeigt. 

Dies entspricht dem Öffnen von 2 SQL-Befehlssitzungen. Änderungen, die in einer Sitzung vorgenommen wurden, sind für andere nicht sichtbar, bis sie festgeschrieben sind.

59
Kaushik Lele

Ich weiß nur, dass, wenn wir session.flush() aufrufen, unsere Anweisungen in der Datenbank ausgeführt, aber nicht festgeschrieben werden.

Angenommen, wir rufen die flush()-Methode nicht für das Sitzungsobjekt auf. Wenn wir die commit-Methode aufrufen, führt sie intern die Ausführung der Anweisungen in der Datenbank und die anschließende Festlegung aus.

commit=flush+commit (bei Funktionalität)

Ich schließe daraus, dass wenn wir die Methode flush () für das Session-Objekt aufrufen, das Commit nicht ausgeführt wird, sondern die Datenbank trifft, die Abfrage ausführt und auch ein Rollback ausführt.

Zum Festschreiben verwenden wir commit () für das Transaktionsobjekt.

21
Shoaib Chikate

Durch das Leeren der Sitzung werden die Daten, die sich aktuell in der Sitzung befinden, mit den Daten in der Datenbank synchronisiert.

Mehr auf der Hibernate-Website:

flush() ist nützlich, da es absolut keine Garantie dafür gibt, wann die Session die JDBC-Aufrufe ausführt, nur in der Reihenfolge, in der sie ausgeführt werden - außer Sie verwenden flush().

12
miku

Sie können flush verwenden, um zu erzwingen, dass Validierungsbedingungen an einem bekannten Ort erkannt und erkannt werden, und nicht, wenn die Transaktion festgeschrieben wird. Es kann sein, dass commit implizit von einer Framework-Logik, einer deklarativen Logik, dem Container oder einer Vorlage aufgerufen wird. In diesem Fall kann es schwierig sein, alle ausgelösten Ausnahmebedingungen abzufangen und zu handhaben (dies könnte im Code zu hoch sein).

Wenn Sie beispielsweise ein neues EmailAddress-Objekt save() haben, das eine eindeutige Einschränkung für die Adresse hat, wird erst nach dem Festschreiben ein Fehler angezeigt.

Der Aufruf von flush() erzwingt das Einfügen der Zeile und löst eine Exception aus, wenn ein Duplikat vorliegt.

Sie müssen jedoch die Sitzung nach der Ausnahme zurücksetzen.

9
rghome

Ich möchte nur alle Antworten zusammenfassen und die Methode Flush () mit Session.save () verknüpfen, um mehr Bedeutung zu erhalten 

Hibernate save () kann verwendet werden, um die Entität in der Datenbank zu speichern. Wir können diese Methode außerhalb einer Transaktion aufrufen. Deshalb mag ich diese Methode nicht, um Daten zu speichern. Wenn wir dies ohne Transaktion verwenden und zwischen Entitäten kaskadieren, wird nur die primäre Entität gespeichert, es sei denn, die Sitzung wird geleert.

flush (): Zwingt die Sitzung zum Flush. Es wird verwendet, um Sitzungsdaten mit der Datenbank zu synchronisieren.

Wenn Sie session.flush () aufrufen, werden die Anweisungen in der Datenbank ausgeführt, es wird jedoch kein Commit ausgeführt .. Wenn Sie session.flush () nicht aufrufen und die session.commit () -Methode (intern) commit () aufrufen führt die Anweisung aus und legt fest.

Commit () = Flush + Commit . Also führt session.flush () nur die Anweisungen in der Datenbank aus (aber keine Commits) und die Anweisungen sind nicht mehr im Speicher. Es zwingt die Sitzung nur zum Flush.

Einige wichtige Punkte:

Wir sollten das Speichern außerhalb der Transaktionsgrenze vermeiden, da sonst zugeordnete Entitäten nicht gespeichert werden und zu Dateninkonsistenz führen. Es ist normal, das Leeren der Sitzung zu vergessen, da keine Ausnahmen oder Warnungen ausgelöst werden. Standardmäßig werden Änderungen automatisch von Hibernate gelöscht: Vor einigen Abfrageausführungen , Wenn eine Transaktion festgeschrieben wird Wenn Sie die Session explizit leeren, erhalten Sie eine genauere Kontrolle, die unter Umständen erforderlich ist (um eine ID zugewiesen zu bekommen, um die Größe der Session zu steuern).

3
Sundar Gsv

Die Methode flush() bewirkt, dass Hibernate die Sitzung löscht. Sie können den Ruhezustand so konfigurieren, dass der Spülmodus für die Sitzung verwendet wird, indem Sie die Methode setFlushMode() verwenden. Um den Flush-Modus für die aktuelle Sitzung zu erhalten, können Sie die Methode getFlushMode() verwenden. Um zu überprüfen, ob die Sitzung fehlerhaft ist, können Sie die isDirty() -Methode verwenden. Standardmäßig verwaltet Hibernate das Leeren der Sitzungen.

Wie in der Dokumentation angegeben:

https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/flushing/Flushing.html

Spülen

Flushing ist der Prozess des Synchronisierens des Zustands der Persistenz Kontext mit der zugrunde liegenden Datenbank. Die EntityManager und die Hibernate Session eine Reihe von Methoden verfügbar machen, durch die die Der Anwendungsentwickler kann den permanenten Status einer Entität ändern.

Der Persistenzkontext fungiert als transaktionaler Write-Behind-Cache jede Entitätsstatusänderung in die Warteschlange stellen. Wie bei jedem Write-Behind-Cache ändert sich werden zuerst im Arbeitsspeicher angewendet und während .__ mit der Datenbank synchronisiert. Spülzeit. Die Flush-Operation nimmt jede Entitätszustandsänderung und übersetzt es in eine INSERT-, UPDATE- oder DELETE-Anweisung.

Die Spülstrategie wird durch den flushMode des aktuellen .__ angegeben. Hibernate Session ausführen. Obwohl JPA nur zwei Spülvorgänge definiert Strategien ( AUTO und COMMIT ), Hibernate hat viel breiteres Spektrum an Flush-Typen:

  • ALWAYS: Leert die Sitzung vor jeder Abfrage.
  • AUTO: Dies ist der Standardmodus, der die Sitzung nur bei Bedarf löscht.
  • COMMIT: Die Sitzung versucht, den Flush zu verzögern, bis die aktuelle Transaktion festgeschrieben ist, obwohl sie möglicherweise auch vorzeitig bereinigt wird.
  • MANUAL: Das Session-Flushing wird an die Anwendung delegiert, die Session.flush() explizit aufrufen muss, um die .__ anzuwenden. Persistenzkontext ändert sich.

Standardmäßig verwendet Hibernate den Flush-Modus AUTO, der eine .__ auslöst. Spülen Sie unter folgenden Umständen:

  • vor dem Begehen einer Transaktion;
  • vor dem Ausführen einer JPQL/HQL-Abfrage, die sich mit den Aktionen in der Warteschlange der Entitäten überschneidet;
  • bevor Sie eine native SQL-Abfrage ausführen, für die keine Synchronisation registriert ist.
1
Aleksey Bykov

Der Aufruf von EntityManager#flush hat Nebeneffekte . Sie wird zweckmäßigerweise für Entitätstypen mit generierten ID-Werten (Sequenzwerten) verwendet: Eine solche ID ist nur bei Synchronisation mit der darunter liegenden Persistenzschicht verfügbar. Wenn diese ID vor dem Ende der aktuellen Transaktion erforderlich ist (z. B. für Protokollierungszwecke), ist ein Leeren der Sitzung erforderlich.

0
johanwannheden

Mit dieser Methode rufen Sie den Spülvorgang auf. Dieser Prozess synchronisiert den Status Ihrer Datenbank mit dem Status Ihrer Sitzung, indem Sie Statusänderungen erkennen und die entsprechenden SQL-Anweisungen ausführen.

0
lennoxGER