2013-01-31 13 views
9

Cosa fa transaction.commit() fare?Che cosa è transaction.commit() in Hibernate?

Account account = new Account(); 
account.setId(100); 
account = (Account) session.get(Account.class, account.getId()); 
System.out.println("Before Transaction: Balance = " + account.getBalance()); 
double preBal = account.getBalance(); 
account.setBalance(50000000); 
Transaction transaction = session.beginTransaction(); 
session.update(account); 
account = (Account) session.get(Account.class, account.getId()); 
System.out.println("After Transaction: Balance = " + account.getBalance()); 
// transaction.commit();  
account = (Account) session.get(Account.class, account.getId()); 
System.out.println("Pev-Bal=" + preBal + " Curr-Bal=" + account.getBalance()); 

Questo mi dà risultati:

Hibernate: select account0_.id as id0_1_, account0_.balance as .......... 
Before Transaction: Balance = 300.0 
After Transaction: Balance = 5.0E7 
Pev-Bal=300.0 Curr-Bal=5.0E7 

Ma dal momento che non ho chiamato transaction.commit() non v'è stato alcun cambiamento nel database.

Ciò significa che tutto è stato eseguito solo su alcune istanze/oggetti senza realmente modificare il database?

Sono nuovo di Hibernate, quindi per favore aiutami a capire. Sto usando hibernate 4.

UPDATE:

se chiamo transaction.commit() allora il risultato avere questa linea

Hibernate: update account set balance=? where id=? 

E Database anche aggiornato.

Ciò significa che senza chiamare lo transaction.commit() tutto è stato eseguito solo a livello di istanza senza realmente modificare il database?

risposta

14

Commit eseguirà il commit del database. Le modifiche all'oggetto persistente verranno scritte nel database. Flushing è il processo di sincronizzazione il persistente archivio persistente tenuto in memoria. ie. verrà aggiornato o inserito nelle tabelle nella transazione in esecuzione, ma è maggio non impegnare tali modifiche (questo dipende da modalità flush).

Quando si dispone di un oggetto persistente e si modifica un valore su di esso, esso diventa sporco e la modalità di sospensione deve scaricare queste modifiche nel livello di persistenza. Può farlo automaticamente per voi o potrebbe essere necessario farlo manualmente, che a seconda della modalità flush (automatico o manuale) :)

Così, in breve: transaction.commit() fa svuotare la sessione , ma finisce anche l'unità di lavoro.

C'è un simile riferimento al vostro problema here

1

Non importa quello che farai, le operazioni di scrittura non può essere fatto al di fuori di una transazione , Hibernate si lamenterà se non ci sono in corso delle transazioni e lanciare un'eccezione Quindi nessuna scelta qui.

Sto aggiungendo a quello sopra preventivo da @pasacal: E quello non sarà effetto DB fino a che non impegni la transazione.

Per ulteriori riferimento How expensive is committing a hibernate transaction?