当检索实体并以编程方式操作它们的某些属性时,将调用自动更新,而hibernate在递增我的db生成的版本列时不会手动调用session.update()
。 (甚至验证发生)
我对我的高版本值和验证感到惊讶。
Hibernate 4.3.1
实体仍然附加到会话。
的伪代码:
Session session = sessinFactory.openSession();
Transaction tr = session.beginTransaction();
Entity entity = session.get(Entity.class, 1);
entity.setFoo("foo");
tr.commit();
session.close(); // here fake-update takes place
问题:
这是一个功能吗?
我可以尝试分离我要操纵的实例。
或者这是一个错误吗?对我来说它更像是一个bug,因为我没有调用更新。但不是虚假更新。
答案 0 :(得分:1)
是的,这是一个功能。当调用tr.commit()
时,会话被刷新。检查与会话相关联的每个对象以查看它是否“脏”(已更改状态)。无论是否调用显式保存,每个更改的对象都将保留到数据库。此外,如果实体是脏的,Hibernate将在刷新期间自动增加版本属性。