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

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(),一切只在实例级别完成,而不是真正更改数据库?

Commit将使数据库提交。 对持久对象的更改将写入数据库。 刷新是将底层持久存储与内存中保持的持久状态同步的过程。 即。 它将在正在运行的事务中更新或插入到表中,但它可能不会提交这些更改(这取决于您的刷新模式)。

当你有一个持久化对象并且你在它上面改变一个值时,它会变脏,而hibernate需要将这些更改刷新到你的持久层。 它可能会自动为您执行此操作,或者您可能需要手动执行此操作,这取决于您的刷新模式(自动或手动):)

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

这里有一个类似的问题参考

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

我正在添加@pasacal的上述引用:这将不会影响数据库直到您提交事务。

有关更多参考提交hibernate事务的成本有多高?