Hibernate: увеличить целое поле

Я хочу увеличить поле в таблице базы данных на 1 с помощью Hibernate.

Я могу сделать это, просто загрузив объект, увеличив значение и обновив объект, однако, если появится другой поток и обновит поле между загрузкой и обновлением, то значение будет повреждено.

поэтому вместо этого я вызвал обновление непосредственно в базе данных:

Query updateHits = createQuery(
    "UPDATE Job SET hitCount = hitCount + 1 WHERE id = :jobId" );
updateHits.setInteger( "jobId", job.getId() );
updateHits.executeUpdate();

однако я понимаю, что это обходит оптимистическую блокировку база данных, и я в настоящее время испытываю проблему с блокировками в SQL server, и я считаю, что это виновник.

есть ли способ увеличить поле без вызова обновления напрямую и при сохранении целостности данных?

1 ответов


Я могу сделать, это просто загрузить объектов, увеличивая значение и обновление объекта, однако, если другой поток приходит и обновляет поле между нагрузкой и обновите, тогда значение станет испорченный.

если второй поток также использует hibernate, и вы используете Hibernate versioning (@Version), один поток, который фиксирует первый и изменяет объект, установит новую версию объекта.

когда приходит вторая фиксация потока, hibernate проверяет оптимистическую блокировку и выдает исключение-StaleObjectException, если я не ошибаюсь. Будет ли блок catch вокруг вашего параллельного кода, у вас будет возможность загрузить объект снова и попробовать обновление, если это имеет смысл. Если вы используете JPA, будет создано исключение OptimisticLockException.

есть много информации в Hibernate Оптимистичный Контроль Параллелизма Раздел.

Ура!