当前位置: 首页 > 面试题库 >

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

乐正峰
2023-03-14
问题内容

是什么 器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()的情况下, 所有操作仅在实例级别完成,而没有真正更改数据库?


问题答案:

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

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

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

There is a similar reference to your problem
here



 类似资料:
  • 主要内容:Hibernate 支持的数据库,Hibernate 是一种全自动的 ORM 框架,Hibernate 提供了缓存机制,JDBC vs HibernateHibernate 是一个开源免费的、基于 ORM 技术的 Java 持久化框架。通俗地说,Hibernate 是一个用来连接和操作数据库的 Java 框架,它最大的优点是使用了 ORM 技术。 2001 年,27 岁的程序员 Gavin King 首次发布了 Hibernate。Gavin King 是一名来自澳大利亚的愤青,他非常

  • 问题内容: 什么是 级联 处于hibernate?我在标记中看到了一个属性。这是什么意思? 像什么意思?我还喜欢阅读其他属性 。 问题答案: 级联是关于涉及一个对象通过关联传播到其他对象的持久性动作。级联可以应用于各种Hibernate动作,并且通常是可传递的。定义关联的注释的“ cascade = …”属性表示应该对该关联进行级联的操作。 Cascade =“ all”表示应用所有主要的层叠类型

  • 问题内容: 什么是Java的延迟加载?我不明白这个过程。有人可以帮助我了解延迟加载的过程吗? 问题答案: 假设您有一个父母,而那个父母有很多孩子。Hibernate现在可以“延迟加载”子级,这意味着它在加载父级时实际上并不会加载所有子级。而是在要求时加载它们。您可以显式地请求此请求,或者,更常见的是,当您尝试访问孩子时,hibernate会自动加载它们。 延迟加载可以帮助显着提高性能,因为通常您不

  • 考虑创建别名方法。文档说:。我不明白这是什么?假设有 2 个表 - 客户(id,和 假设条件 - 关联路径应该是什么? “Customer.id = Order.customer_id” 或者只是我在某些论坛上看到的“订单”? 有人能为几种情况提供几个例子吗,比如左连接、内连接,当然还有带子句的连接?

  • 问题内容: Hibernate文档具有以下有关注释的信息: 在纯Java API中,未定义时间的时间精度。处理时态数据时,您可能需要描述数据库中的预期精度。时间数据可以具有DATE,TIME或TIMESTAMP精度(即实际日期,仅时间或两者兼有)。使用@Temporal批注进行微调。 什么意思 什么是数据及其精度?如何调整? 问题答案: 必须为类型为和的持久字段或属性指定此注释。只能为这些类型的字

  • 问题内容: 在阅读Hibernate文档时,我不断看到对 自然标识符 概念的引用。 这是否仅表示实体因其拥有的数据的性质而具有的ID? 例如,用户名+密码+年龄+某些内容用作复合标识符? 问题答案: 在Hibernate中,自然键通常用于查找。在大多数情况下,您将拥有一个自动生成的代理ID。但是,此ID对于查找而言毫无用处,因为您将始终通过名称,社会保险号或其他来自现实世界的字段进行查询。 在使用