我有一个实体:
<class name="name.dargiri.model.Entity" table="ENTITY" optimistic-lock="version">
<version name="version" column="ver" type="long" />
</class
如果保存实体无论多少次,在事务结束中,Hibernate会选择该对象的版本。为什么? Hibernate在存储对象时生成此版本,因此它知道它。我发现这个方法调用了这个:
EntityVerifyVersionProcess#getCurrentVersion()
Hibernate在日志中生成这个:
Hibernate:
/* update
name.dargiri.model.Entity */ update
ENTITY
set
ver=?,
USERNAME=?,
lucky_number=?
where
id=?
and ver=?
Hibernate:
/* get version name.dargiri.model.Entity */ select
ver
from
ENTITY
where
id =?
我使用MySQL和Session#save()。
答案 0 :(得分:0)
Hibernate执行额外的SQL语句以在更新完成后检索版本号,因为版本号由数据库管理。有关详细信息,建议您查看此article,这可以很好地解释这一点。
答案 1 :(得分:0)
好的,我没有写的内容和看似问题的是使用LockMode.OPTIMISTIC:
session.get(Entity.class, 1L, LockMode.OPTIMISTIC);
这似乎是这种锁模式的工作原理 - 它在事务结束时检查到目前为止是否没有人更改对象的版本。这种情况不会在刷新时发生,因为Hibernate无论如何都会进行检查,但是在交易结束时,我认为,在覆盖数据时需要更加谨慎。