10

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的新手,所以请帮助我理解。我正在使用休眠 4。

更新:

如果我调用transaction.commit()那么结果有这一行

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

并且数据库也更新了。

这是否意味着不调用transaction.commit()一切都只在实例级别完成而没有真正改变数据库?

4

2 回答 2

16

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

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

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

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

于 2013-01-31T13:06:53.787 回答
1

无论你做什么,写操作都不能在事务之外进行,如果没有正在进行的事务,Hibernate 会报错并抛出异常。所以这里别无选择。

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

更多参考 提交休眠事务有多昂贵?

于 2013-01-31T13:12:40.630 回答