Hibernate 中的 transaction.commit() 是啥?

Posted

技术标签:

【中文标题】Hibernate 中的 transaction.commit() 是啥?【英文标题】:What is transaction.commit() in Hibernate?Hibernate 中的 transaction.commit() 是什么? 【发布时间】:2013-01-15 09:18:34 【问题描述】:

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() 一切都只在实例级别完成而没有真正改变数据库?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

无论你做什么,写操作都不能在 a 事务,如果没有进行中,Hibernate 会抱怨 事务并抛出异常。所以这里别无选择。

我正在添加@pasacal 的上述引用:这不会生效 数据库直到你提交事务。

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

【讨论】:

以上是关于Hibernate 中的 transaction.commit() 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 FetchType.LAZY 防止 JPA/Hibernate 中的延迟加载(尤其是在使用 @Transactional 时)?

hibernate.transaction.manager_lookup_class VS hibernate.transaction.jta.platform

在JUNIT测试中没有创建Hibernate Transaction

@Transactional 与 JPA 和 Hibernate 有啥用?

使用 Spring @Transactional 管理 Hibernate 事务

Hibernate - @Transactional 不起作用有啥特别的原因吗?