为什么我需要在使用Hibernate查找后明确保存?

roc*_*ker 5 java hibernate

为什么我需要"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

同样的问题适用于

  1. session.save(用户);
  2. user.setName( "跷!");
  3. ta.commit();

更新2

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

Boz*_*zho 5

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

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

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

尝试使用HQL查询,文档清晰:

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

还要确保会话的刷新模式设置为AUTOCOMMIT.