Hibernate: увеличение целочисленного поля - PullRequest
10 голосов
/ 25 марта 2011

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

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

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

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

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

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

1 Ответ

4 голосов
/ 25 марта 2011

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

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

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

В разделе Hibernate Optimistic Параллельное управление есть масса информации .

Ура! * * 1013

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...