一尘不染

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

mysql

是什么 器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的新手,所以请帮助我理解。我正在使用hibernate4。

更新:

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

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

并且数据库也更新了。

这是否意味着在不调用 transaction.commit()的情况下, 所有操作仅在实例级别完成,而没有真正更改数据库?


阅读 439

收藏
2020-05-17

共1个答案

一尘不染

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

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

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

There is a similar reference to your problem
here

2020-05-17