Гибернация и логика "наибольшая ценность выигрывает" - PullRequest
0 голосов
/ 29 апреля 2011

У меня есть таблица рекордов в моей базе данных, у нее есть два значения:

player_id
highest_score

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

update high_scores
set highest_score = :new_high_score
where player_id = :player_id
and highest_score <= :new_high_score

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

Есть ли способ попросить hibernate сделать что-то подобное или янужно прибегнуть к пользовательскому SQL?

1 Ответ

2 голосов
/ 29 апреля 2011

hibernate поддерживает массовое обновление (начиная с 3.3).

Edit:

Проверка: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-direct

Упрощение (из документов Hibernate):

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
// or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
        .setString( "newName", newName )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();

ура!

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