What is transaction.commit() in Hibernate?

39,852

Solution 1

Commit will make the database commit. The changes to persistent object will be written to database. Flushing is the process of synchronizing the underlying persistent store with persistant state held in memory. ie. it will update or insert into your tables in the running transaction, but it may not commit those changes (this depends on your flush mode).

When you have a persisted object and you change a value on it, it becomes dirty and hibernate needs to flush these changes to your persistence layer. It may do this automatically for you or you may need to do this manually, that depends on your flush mode(auto or manual) :)

So in short: transaction.commit() does flush the session, but it also ends the unit of work.

There is a similar reference to your problem here

Solution 2

No matter what you'll do, write operations can't be done outside a transaction, Hibernate will complain if there is no ongoing transaction and throw an exception. So no choice here.

I am adding to that above quote by @pasacal : And that won't be effect DB untill you commit the transaction .

For more reference How expensive is committing a hibernate transaction?

Share:
39,852
Mawia
Author by

Mawia

Java Programmer

Updated on August 22, 2022

Comments

  • Mawia
    Mawia over 1 year

    What does transaction.commit() do?

    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());
    

    This gives me result:

    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
    

    But since I did not call transaction.commit() there was no change in Database.

    Does this means everything was done only on some instance/objects without really changing the Database?

    I am new to Hibernate, so please help me understand. I am using hibernate 4.

    UPDATE:

    IF I call transaction.commit() then the result have this line

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

    And Database also updated.

    Does this mean that without calling transaction.commit() everything was done only on instance level without really changing the Database?