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 Оптимистичный Контроль Параллелизма Раздел.
Ура!