2012-05-29 9 views
10

Mi stavo chiedendo se qualcuno potesse dirmi che cosa è una sessione sporca di letargo? Mi sembra di avere un problema in cui una query di criteri sta eseguendo un inserimento quando non dovrebbe. Credo che sia legato a una sessione sporca, ma senza sapere veramente cos'è una sessione sporca, non sono in grado di risolvere il mio problema. Inoltre, come si crea una sessione sporca. Grazie.Che cos'è una sessione di Hibernate dirty?

risposta

19

La sessione Hibernate è una cache. Memorizza nella cache le entità lette dal database e memorizza nella cache anche le modifiche apportate alle entità che contiene, nonché le entità aggiunte e rimosse, fino a quando la sessione viene svuotata (cioè tutte le modifiche in sospeso vengono scritte nel database).

Una sessione è detta sporca quando alcune modifiche non sono ancora state scaricate. Ed è quindi perfettamente normale avere una sessione sporca. La sessione viene svuotata prima del commit della transazione.

+0

se non voglio che la query inneschi un flush, dovrei impostare la query di criteri setFlushMode su manual, o dovresti conciderla come un cerotto risolvere? –

+0

@George se non si desidera salvare le modifiche apportate agli oggetti, provare a eseguire tali modifiche al di fuori della sessione – richarbernal

+0

Immagino che dovrò cercare alcune informazioni aggiuntive su come archiviare i miei dati al di fuori della sessione. Sono ancora abbastanza nuovo da ibernare, quindi non sono del tutto sicuro di come inizi con la sessione. –

2

Significa solo che sono state apportate modifiche a oggetti in memoria, gestiti, persistenti, che non sono ancora stati scaricati nel database.

Fondamentalmente l'idea alla base dell'ibernazione è che lo stato degli oggetti persistenti in memoria è lo stato dell'applicazione. Se apporti una modifica a un oggetto gestito, Hibernate lo inserirà nel database alla prossima opportunità. Non dovresti apportare modifiche "temporanee" agli oggetti gestiti che non intendi diventare persistenti, perché lo saranno!

Prima di eseguire una query, la modalità ibernazione scarica lo stato in memoria di tutti gli oggetti gestiti nel database, in modo che la query sia accurata rispetto allo stato dell'applicazione.

+0

In realtà, è più complicato di così: Hibernate svuota solo se le modifiche in sospeso potrebbero avere un impatto sulla query eseguita. –

+0

Esiste un metodo consigliato per impedire alla query di eseguire un inserimento prima che gli dica di inserire l'oggetto? Ho usato setFetchMode per il manuale che ha funzionato, tuttavia ritengo che questa potrebbe essere solo una correzione dell'aiuto di banda piuttosto che una correzione di root. –

+1

Il FlushMode può essere modificato per l'intera applicazione su SessionFactory, probabilmente su COMMIT, non su MANUAL, se non si desidera che effettui inserimenti e aggiornamenti prima della fine della transazione. Questa è la soluzione, tuttavia, se si apportano modifiche alle entità gestite che non si desidera scrivere nel database, non solo un bandaid. – Affe

5

Una sessione dirty in Hibernate è quando si carica un oggetto all'interno della sessione e quindi lo si modifica.

Oppure, quando si apre una sessione e si crea un nuovo oggetto.

Anche se non esplicitamente dichiara chiamare qualsiasi operazione di inserimento/aggiornamento, Hibernate segna la sessione come sporco e salva le modifiche quando la sessione viene chiusa

2

In parole semplici: come sappiamo, i dati sporchi sono quelli che non sono stati ancora impegnati. Allo stesso modo, la sessione dirty in hibernate contiene dati modificati che non sono stati ancora impegnati.

Problemi correlati