3

我有一个实体:

<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()。

4

2 回答 2

0

由于版本号由数据库管理,Hibernate 会在更新完成后执行额外的 SQL 语句来检索版本号。有关更多详细信息,我建议您看一下这篇文章,它很好地解释了这一点。

于 2012-04-23T08:16:32.830 回答
0

好的,所以我没有写的内容似乎是使用 LockMode.OPTIMISTIC 的问题: session.get(Entity.class, 1L, LockMode.OPTIMISTIC);

看起来这就是这种锁定模式的工作方式——它在事务结束时检查到目前为止是否没有人更改对象的版本。这不会在刷新时发生,因为 Hibernate 无论如何都会进行检查,而是在事务结束时进行检查,我认为这是在覆盖数据时更加小心的附加选项。

于 2012-04-23T16:43:44.383 回答