2013-01-31 13 views
9

Was macht transaction.commit()?Was ist 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()); 

Das gibt mir führen:

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 

Aber da ich nicht transaction.commit angerufen hat() gab es keine Veränderung in der Datenbank.

Bedeutet dies, dass alles nur für einige Instanzen/Objekte ausgeführt wurde, ohne die Datenbank wirklich zu ändern?

Ich bin neu in Hibernate, also bitte helfen Sie mir zu verstehen. Ich verwende Hibernate 4.

UPDATE:

IF I transaction.commit() aufrufen dann das Ergebnis haben diese Linie

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

Und Datenbank ebenfalls aktualisiert.

Bedeutet dies, dass ohne Aufruf transaction.commit() alles nur auf Instanzebene getan wurde, ohne wirklich die Datenbank zu ändern?

Antwort

14

Commit wird die Datenbankfestschreibung vornehmen. Die Änderungen am persistenten Objekt werden in die Datenbank geschrieben. Flushing ist der Prozess Synchronisierung der zugrunde liegenden persistenten Speicher mit persistenten Zustand im Speicher gehalten. dh. Es wird aktualisiert oder einfügen in Ihre Tabellen in der laufenden Transaktion, aber es kann nicht diese Änderungen fest (dies hängt von Ihre Flush-Modus).

Wenn Sie ein persistentes Objekt haben und einen Wert darauf ändern, wird es schmutzig und der Ruhezustand muss diese Änderungen an Ihrer Persistenzschicht löschen. Es kann dies für Sie automatisch tun, oder Sie können diese müssen manuell tun, die auf Ihrem Flush Modus (automatisch oder manuell) hängt :)

Also kurz gesagt: transaction.commit() die Sitzung tut bündig , aber es beendet auch die Arbeitseinheit.

Es gibt einen ähnlichen Bezug auf Ihr Problem here

1

Egal, was Sie tun werden, Operationen schreiben können nicht außerhalb einer Transaktion durchgeführt werden, wird Hibernate beschweren, wenn es keine laufende Transaktion ist und eine Ausnahme auslösen Also keine Wahl hier.

Ich füge oben Zitat von @pasacal hinzu: Und das wird nicht Wirkung sein DB, bis Sie die Transaktion festschreiben.

Weitere Referenz How expensive is committing a hibernate transaction?

Verwandte Themen