2012-04-23 61 views
3

我有一个实体的版本:休眠。乐观锁定。选择即使它产生它

<class name="name.dargiri.model.Entity" table="ENTITY" optimistic-lock="version"> 
    <version name="version" column="ver" type="long" /> 
</class 

如果实体保存无论多少次,交易的结束休眠选择的对象的版本。为什么? 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和会话#保存()。

+0

我想了一下,回想起第一次保存后我没有刷新。每次更新后都会尝试刷新,可能会导致在每次保存()后进行选择。 – 2012-04-23 10:38:59

回答

0

好了,所以我没写什么似乎是问题是使用LockMode.OPTIMISTIC: session.get(Entity.class, 1L, LockMode.OPTIMISTIC);

看来,这是这种锁模式是如何工作的 - 它检查的结束该事务是否迄今为止没有人更改该对象的版本。而这种情况不会在冲洗时发生,因为Hibernate无论如何都会执行检查,但是在事务结束时,我认为,更多的选择是在覆盖数据时更加小心。

+0

还不错 – kyiu 2012-04-23 17:16:05

0

由于版本号由数据库管理,因此Hibernate执行额外的SQL语句以检索更新后的版本号。欲了解更多详情,我建议你看看这个article,这很好地解释了这一点。

+0

仔细看看那篇文章。只有在生成=“始终”时才会发生选择。这不是我的情况。而且即使是这种情况,Hibernate也会在每次更新后执行select,而不是在事务提交时执行。 – 2012-04-23 09:49:20

+0

糟糕,没有引起足够的重视。我的坏...你实际使用什么方法将实体保存到数据库中? – kyiu 2012-04-23 09:57:32

+0

It's Session#save() – 2012-04-23 10:20:55