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

解决方法

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

当你有一个持久的对象,你改变一个
它的价值,它变得脏,休眠需要刷新这些
更改您的持久层.它可以自动执行
您或您可能需要手动执行,这取决于您的齐平
模式(自动或手动):)

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

一个类似的参考你的问题here

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...