2011-11-15 13 views
40

Vorrei sapere cosa fa esattamente ogni elemento in questa lista, come funziona, quali sono le conseguenze e quando è il momento giusto per l'uso.Ibernazione: aggiornamento, eliminazione, replica e lavaggio

  1. Refresh
  2. Evict
  3. Replicate
  4. Flush

Ho anche domando quanto ognuno fa, ma non sono assolutamente sicuri, quindi mi sto chiedendo il vostro aiuto, perché voglio davvero capirlo.

So che è una domanda piuttosto generica, ma penso che sia davvero utile sapere tutto.

Grazie.

risposta

41

Il Hibernate Documentation fornisce buoni esempi di questo. Anche questo blog post ti darà qualche idea. Aggiungerò qualche riga da lì sotto.

È possibile ricaricare un oggetto e tutte le sue raccolte in qualsiasi momento, utilizzando il metodo refresh(). Ciò è utile quando i trigger del database vengono utilizzati per inizializzare alcune proprietà dell'oggetto.

sess.save(cat); 
sess.flush(); //force the SQL INSERT 
sess.refresh(cat); //re-read the state (after the trigger executes) 

vedere here per ulteriori esempi.

Ogni volta che si passa un oggetto a save(), update() or saveOrUpdate(), e ogni volta che si recupera un oggetto utilizzando load(), get(), list(), iterate() or scroll(), quell'oggetto viene aggiunto alla cache interna della sessione.

Quando viene successivamente chiamato flush(), lo stato di tale oggetto verrà sincronizzato con il database. Se non si desidera che questa sincronizzazione si verifichi o se si elabori un numero enorme di oggetti e sia necessario gestire la memoria in modo efficiente, è possibile utilizzare il metodo evict() per rimuovere l'oggetto e le relative raccolte dalla cache di primo livello.

ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set 
while (cats.next()) { 
    Cat cat = (Cat) cats.get(0); 
    doSomethingWithACat(cat); 
    sess.evict(cat);  // (if gives the compile time error then use it: sess.evict(cat.getClass()); 
} 

Leggi l'esempio completo da here.

Ulteriori informazioni sull'API di sessione here.

+0

Sto provando a chiamare sessionFectory.evict (cat) ma mi dà errore di compilazione - argomento non applicabile. –

+1

@KevalTrivedi Considera la possibilità di pubblicare una nuova domanda con tutte le informazioni pertinenti come il tuo codice di esempio e i tuoi registri. – ManuPK

10

replicate() deve essere utilizzato al posto di save()/persist() quando è necessario salvare un'entità con un determinato identificativo nonostante il fatto che l'identificatore di detta entità sia configurato per essere generato.

È utile quando alcune entità (forse provenienti da sistemi esterni) hanno identificatori preesistenti, mentre altre entità dello stesso tipo necessitano di identificatori da generare.

Tuttavia, a causa di un bug di lunga durata in Hibernate (HHH-1459, HHH-2716) replicate() non funziona come previsto con alcuni tipi di generatori di ID. Questo problema limita l'utilità di replicate() e richiede l'implementazione di spiacevoli soluzioni alternative per emularne il comportamento se la strategia del generatore di id è interessata e non è possibile modificarla.

3
  • session.flush() Il lavaggio della sessione impone Hibernate per sincronizzare lo stato in memoria della sessione con il database.
  • session.evict() Staccare l'oggetto dalla cache di sessione. Dopo aver scollegato l'oggetto dalla sessione, qualsiasi modifica all'oggetto non verrà mantenuta.
  • session.refresh() Ricarica tutti i dati.
  • session.replicate() I dati vengono replicati in diversi Datastore in diverse modalità.
Problemi correlati