为什么我需要"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();
Run Code Online (Sandbox Code Playgroud)
更新1
同样的问题适用于
更新2
解决问题的方法是:我使用的是guice/warp persist.在某些情况下,我通过@Transactional错误地将代码块绑定到事务:因此事务提交过早提交,因此单独的更改未包含在提交中.多谢你们!因此,如果您使用spring或guice,请务必确保了解您的交易范围...
你是正确的,hibernate应该自动检测持久对象状态的变化:
持久性 - 持久性实例在数据库中具有表示形式和标识符值.它可能刚刚被保存或加载,但是,它定义在Session的范围内.Hibernate将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步.当对象应该是瞬态的时,开发人员不会执行手动UPDATE语句或DELETE语句.
我会假设标准结果不会以持久状态返回(但我似乎无法在文档中找到此证据)
尝试使用HQL查询,文档清晰:
查询检索的实体实例处于持久状态
还要确保会话的刷新模式设置为AUTO或COMMIT.
| 归档时间: |
|
| 查看次数: |
1532 次 |
| 最近记录: |