为什么我需要“session.save(user);”这一行在以下代码段中?我想,通过查找调用,用户已经连接到会话,并且将跟踪和提交更改。你介意给我解释一下细节吗?或者我是否需要特殊配置或其他可以听说此“功能”的情况?
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
同样的问题适用于
更新2
问题的解决方案是:我正在使用guice / warp persist。在某些情况下,我通过@Transactional错误地将代码块绑定到事务:因此事务提交过早提交,因此单独的更改未包含在提交中。多谢你们!因此,如果您使用的是spring或guice,请务必确认您的交易范围......
答案 0 :(得分:5)
你是正确的,hibernate应该自动检测持久对象状态的变化:
持久性 - 持久性实例在数据库中具有表示形式和标识符值。它可能刚刚被保存或加载,但是,它定义在Session的范围内。 Hibernate将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步。当对象应该是瞬态的时,开发人员不会执行手动UPDATE语句或DELETE语句。
我认为标准结果不会以持久状态返回(但我似乎无法在文档中找到证据)
尝试使用HQL查询,文档清晰明了:
查询检索的实体实例处于持久状态
同时确保会话的刷新模式设置为AUTO
或COMMIT
。