Qual è l’uso di session.flush () in Hibernate

Quando aggiorniamo un record, possiamo usare session.flush() con Hibernate. Qual è la necessità di flush() ?

Il lavaggio della sessione forza Hibernate a sincronizzare lo stato in memoria della Session con il database (ad esempio, per scrivere modifiche al database). Per impostazione predefinita, Hibernate scaricherà automaticamente le modifiche per te:

  • prima di alcune esecuzioni di query
  • quando viene eseguita una transazione

Consentire di scaricare esplicitamente la Session offre un controllo più fine che potrebbe essere necessario in alcune circostanze (per ottenere un ID assegnato, per controllare la dimensione della sessione, …).

Come giustamente detto nelle risposte di cui sopra, chiamando flush() forziamo l’ibernazione per eseguire i comandi SQL sul Database. Ma capisci che i cambiamenti non sono ancora “commessi”. Quindi, dopo aver eseguito flush e prima di fare commit, se accedi direttamente al DB (ad esempio dal prompt di SQL) e controlli le righe modificate, NON vedrai le modifiche.

Questo è come aprire 2 sessioni di comandi SQL. E i cambiamenti fatti in 1 sessione non sono visibili agli altri fino a quando non vengono confermati.

So solo che quando chiamiamo session.flush() nostre istruzioni vengono eseguite nel database ma non vengono eseguite.

Supponiamo di non chiamare il metodo flush() sull’object di sessione e se chiamiamo il metodo di commit …. eseguirà internamente il lavoro di esecuzione delle istruzioni sul database e quindi di commit.

commit=flush+commit (in caso di funzionalità)

Quindi, concludo che quando chiamiamo metodo flush () sull’object Session, esso non ottiene il commit ma colpisce il database ed esegue la query e ottiene anche il rollback

Per eseguire il commit, usiamo commit () sull’object Transaction

Flushing the Session recupera i dati attualmente sincronizzati con quelli presenti nel database.

Maggiori informazioni sul sito Web di Hibernate:

flush() è utile, perché non ci sono assolutamente garanzie circa il momento in cui la Session esegue le chiamate JDBC, solo l’ordine in cui vengono eseguite – eccetto che si usa flush() .

È ansible utilizzare flush per forzare i vincoli di convalida per essere realizzati e rilevati in un luogo noto invece che quando viene eseguita la transazione. Può essere che il commit venga chiamato implicitamente da qualche logica di quadro, dalla logica dichiarativa, dal contenitore o da un modello. In questo caso, qualsiasi eccezione generata può essere difficile da catturare e gestire (potrebbe essere troppo alta nel codice).

Ad esempio, se si save() un nuovo object EmailAddress, che ha un vincolo univoco sull’indirizzo, non si otterrà un errore finché non si esegue il commit.

Calling flush() forza la riga da inserire, generando un’eccezione se c’è un duplicato.

Tuttavia, sarà necessario ripristinare la sessione dopo l’eccezione.

Vorrei solo racchiudere tutte le risposte di cui sopra e anche colbind il metodo Flush () con Session.save () in modo da dare più importanza

Hibernate save () può essere usato per salvare l’ quadro nel database. Possiamo invocare questo metodo al di fuori di una transazione, ecco perché non mi piace questo metodo per salvare i dati. Se usiamo questo senza transazione e abbiamo una cascata tra quadro, solo l’ quadro primaria viene salvata a meno che non si svuota la sessione.

flush (): forza la sessione a svuotare. Viene utilizzato per sincronizzare i dati della sessione con il database.

Quando si chiama session.flush (), le istruzioni vengono eseguite nel database ma non verranno confermate. Se non si chiama session.flush () e se si chiama session.commit (), internally commit () metodo esegue l’istruzione e si impegna.

Quindi commit () = flush + commit. Quindi session.flush () esegue semplicemente le istruzioni nel database (ma non esegue il commit) e le istruzioni NON sono più IN MEMORIA. Implica semplicemente la sessione a svuotare.

Pochi punti importanti:

Dovremmo evitare di salvare al di fuori del limite della transazione, altrimenti le quadro mappate non verranno salvate causando incoerenza dei dati. È normale dimenticare di svuotare la sessione perché non genera eccezioni o avvisi. Per impostazione predefinita, Hibernate svuota automaticamente le modifiche: prima di alcune esecuzioni di query quando una transazione è impegnata Consentendo di svuotare esplicitamente la sessione offre un controllo più fine che potrebbe essere richiesto in alcune circostanze (per ottenere un ID assegnato, per controllare la dimensione della sessione )

Calling EntityManager#flush ha effetti collaterali . Viene convenientemente utilizzato per tipi di quadro con valori ID generati (valori di sequenza): tale ID è disponibile solo dopo la sincronizzazione con il livello di persistenza sottostante. Se questo ID è richiesto prima della fine della transazione corrente (per scopi di registrazione, ad esempio), è necessario eseguire il flushing della sessione.