Контроль порядка обновлений в спящем режиме - PullRequest
5 голосов
/ 29 мая 2011

У меня есть таблица с уникальным столбцом, «токеном», навязанным уникальным ограничением в базе данных.В определенном случае мне нужно изменить существующую строку так, чтобы она имела тот же токен, что и другая существующая строка, изменив 2-ую строку на новое значение.

Итак, скажем, у меня есть:

id; токен 0; 'aaa' 1; 'bbb'

Я хочу, чтобы id 0 ('aaa') вместо этого имел токен 'bbb'.Поэтому мне нужно изменить «bbb» на «jfeisefjse», а затем я могу изменить «aaa» на «bbb».Это можно сделать в postgres за один раз.

Я пытался сделать то же самое в коде: в одной транзакции я получаю токен из существующей строки (строка 1), я устанавливаю его равнымслучайное значение, я обновляю другую строку (строка 0), чтобы получить токен строки 1, а затем фиксирую.Однако hibernate не соблюдает порядок, в котором я делал коммиты. Кажется, сначала всегда запускается оператор update для строки 0, и postgres жалуется, что он нарушает ограничение внешнего ключа.

Как я могу сделатьСпящий режим сделать это?Принудительно ли выполнять определенный порядок операторов обновления, или каким-либо другим способом сделать это?

Примечание. Делать это в двух транзакциях (одна для скремблирования строки 1, затем другая транзакция для обновления строки 0) не вариант.

1 Ответ

5 голосов
/ 29 мая 2011

Session.flush() заставит hibernate написать любой ожидающий SQL без фиксации транзакции.Это немного неуклюже, но иногда вам нужно получить немного меньше ORM и заставить все работать просто:)

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