【发布时间】: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
同样的问题也适用于
- session.save(user);
- user.setName("摇杆!");
- ta.commit();
更新 2
问题的解决方法是:我正在使用 guice / warp persist。在某些情况下,我通过@Transactional 错误地将代码块绑定到事务:因此事务提交得太早打开,因此单独的更改未包含在提交中。多谢你们!因此,请始终确保您了解您的事务范围,以防您使用 spring 或 guice...
【问题讨论】:
-
你有没有打开休眠日志来检查从 uniqueresult() 和 commit() 返回之间发生了什么?
-
在过去几个月里,我总是用 hibernate 明确地“保存”。直到今天:我自己问这个的地方。我将查看日志。但是看看我在代码下面的编辑:在我已经调用了保存之后,显式保存也是必要的
-
好吧,只要某件事“直到今天”运行了很长时间并且代码没有改变,这意味着其他地方的一些配置已经改变 - 请务必查看整个项目/应用程序中究竟发生了什么变化最后已知的工作状态。显然,事情不会停止工作。
-
不,我的意思是:一切都和以前一样完美,但我想:嘿,为什么这个保存调用根本是必要的?顺便说一句:日志说:没有那个明确的保存调用,就不会发出 UPDATE 命令。
-
“普通休眠”是什么意思