【问题标题】:Why I need to explicitely save after a find with Hibernate?为什么我需要在使用 Hibernate 查找后显式保存?
【发布时间】:2010-07-14 11:08:25
【问题描述】:

为什么我需要“session.save(user);”行在下面的代码sn-p?我想,通过 find 调用,用户已经附加到会话中,并且将跟踪和提交更改。你介意为我解释一下细节吗?或者我是否需要特殊配置或其他我可能听说过此“功能”的情况?

session = createSession();
ta = session.beginTransaction();
assertEquals(1, session.createCriteria(MyUser.class).list().size());
// find one user
MyUser user = session.createCriteria(MyUser.class).uniqueResult();
user.setName("Rocker!");
// ### HERE ###
// WHY this 'save' is necessary!!??
session.save(user);
ta.commit();

ta = session.beginTransaction();
assertEquals(1, session.createCriteria(MyUser.class).list().size());
MyUser user = session.createCriteria(MyUser.class).uniqueResult();
assertEquals("Rocker!", user.getName());
ta.commit();

更新 1

同样的问题也适用于

  1. session.save(user);
  2. user.setName("摇杆!");
  3. ta.commit();

更新 2

问题的解决方法是:我正在使用 guice / warp persist。在某些情况下,我通过@Transactional 错误地将代码块绑定到事务:因此事务提交得太早打开,因此单独的更改未包含在提交中。多谢你们!因此,请始终确保您了解您的事务范围,以防您使用 spring 或 guice...

【问题讨论】:

  • 你有没有打开休眠日志来检查从 uniqueresult() 和 commit() 返回之间发生了什么?
  • 在过去几个月里,我总是用 hibernate 明确地“保存”。直到今天:我自己问这个的地方。我将查看日志。但是看看我在代码下面的编辑:在我已经调用了保存之后,显式保存也是必要的
  • 好吧,只要某件事“直到今天”运行了很长时间并且代码没有改变,这意味着其他地方的一些配置已经改变 - 请务必查看整个项目/应用程序中究竟发生了什么变化最后已知的工作状态。显然,事情不会停止工作。
  • 不,我的意思是:一切都和以前一样完美,但我想:嘿,为什么这个保存调用根本是必要的?顺便说一句:日志说:没有那个明确的保存调用,就不会发出 UPDATE 命令。
  • “普通休眠”是什么意思

标签: java hibernate


【解决方案1】:

你是正确的,hibernate 应该自动检测持久对象状态的变化:

持久 - 持久实例在数据库中具有表示形式和标识符值。它可能刚刚被保存或加载,但是,根据定义,它是在 Session 的范围内。 Hibernate 将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步。开发人员不执行手动 UPDATE 语句,或在对象应为瞬态时执行 DELETE 语句。

我会假设标准结果不会以持久状态返回(但我似乎无法在文档中找到证明)

尝试使用文档清楚的 HQL 查询:

查询检索到的实体实例处于持久状态

还要确保会话的刷新模式设置为AUTO 或COMMIT。

【讨论】:

  • 冲洗模式 'AUTO' - 这是默认设置,我该如何更改?
  • 与 HQL 查询相同:需要显式保存(更改后)。
  • @rocker, session.setFlushMode(FlushMode.AUTO).
  • @Peter Török 这是默认设置,对吧? @Bozho 谢谢。如果没有确定,我不会调查它的细节! -> 查看我的更新 2
  • @rocker,是的,这是默认设置(我不确定,但现在我检查了)。
猜你喜欢
  • 2015-07-24
  • 2021-06-30
  • 1970-01-01
  • 2010-11-20
  • 2017-11-27
  • 2015-08-12
  • 2016-12-13
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多