什么是Hibernate中的transaction.commit()?

时间:2013-01-31 09:58:07

标签: java mysql database hibernate

transaction.commit()做什么?

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

这给了我结果:

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

但由于我没有调用 transaction.commit(),因此数据库没有变化。

这是否意味着一切只在某些实例/对象上完成而没有真正更改数据库?

我是Hibernate的新手,所以请帮助我理解。 我正在使用hibernate 4。

更新:

如果我致电 transaction.commit(),则结果会显示此行

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

数据库也更新了。

这是否意味着如果不调用 transaction.commit(),所有操作都只在实例级别完成,而不会真正更改数据库?

2 个答案:

答案 0 :(得分:15)

提交将使数据库提交。对持久对象的更改将写入数据库。 刷新同步基础持久性的过程 具有持久状态的商店在记忆中保存。 即。它将在运行中更新或插入到表中 事务,但可能不提交这些更改(这取决于 你的冲洗模式)。

如果您有持久对象并且更改了 它上面的值,它变脏了,休眠需要冲洗它们 对持久层的更改。它可以自动执行此操作 您或您可能需要手动执行此操作,具体取决于您的同花顺 模式(自动或手动):)

简而言之: transaction.commit()会刷新会话,但它也会结束工作单元。

您的问题here

也有类似的提法

答案 1 :(得分:1)

  

无论你做什么,写操作都不能在外面完成   交易,如果没有正在进行,Hibernate会抱怨   事务并抛出异常。所以没有选择。

     

我在@pasacal上面添加上述引用:这不会有效   DB直到你提交交易。

供更多参考 How expensive is committing a hibernate transaction?