2012-04-23 3 views
3

У меня есть сущность:Hibernate. Оптимистичный замок. Выбор версии, даже если он генерирует это

<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

Хорошо, так что я не писал о том, что и оказалось проблема с использованием LockMode.OPTIMISTIC: session.get(Entity.class, 1L, LockMode.OPTIMISTIC);

Оказалось, что это, как работает этот режим блокировки - он проверяет в конце транзакция, пока никто не изменил версию объекта. И это происходит не во время очистки, потому что Hibernate в любом случае выполнит проверку, но к концу транзакции, которая, я думаю, будет дополнительной опцией, чтобы быть более осторожным в отношении перезаписи данных.

+0

По-прежнему полезно знать – kyiu

0

Hibernate выполняет дополнительную инструкцию SQL для получения номера версии после того, как обновление было выполнено, поскольку номер версии управляется базой данных. Для более подробной информации я предлагаю вам взглянуть на этот article, который объясняет это очень хорошо.

+0

Присмотритесь к этой статье. Выбор происходит только в том случае, если сгенерировано = «всегда». Это не мое дело. Более того, даже если бы это было так, Hibernate выполнил бы выбор после каждого обновления, а не во время транзакции. –

+0

Упс, не обратили на это внимание достаточно внимательно. Мой плохой ... Какой метод вы используете для сохранения объекта в БД? – kyiu

+0

Это сеанс # save() –

Смежные вопросы