Hibernate генерирует исключение нарушения уникального ограничения при обновлении части поля уникального ключа - PullRequest
4 голосов
/ 19 августа 2010

Ниже приведен пример использования: У меня есть уникальный индекс, определенный на 3 столбца, скажем A, B, C. Предположим, значения в них являются A1, B1, C1. Мой код Java добавляет новую запись, скажем, A1, B1, C1, но перед добавлением этой записи я обновляю предыдущее значение с C1 до C2. При попытке добавить новую запись (после обновления) hibernate выдает уникальное исключение нарушения ограничения. Есть причина, почему это так? Все вышеуказанные операторы выполняются в рамках одной транзакции. Я предполагаю, что вставка происходит до обновления и, следовательно, причина исключения.

Есть мысли / предложения?

Ответы [ 2 ]

4 голосов
/ 20 августа 2010

Мой код Java добавляет новую запись, скажем, A1, B1, C1, но перед добавлением этой записи я обновляю предыдущее значение с C1 до C2.При попытке добавить новую запись (после обновления) hibernate выдает уникальное исключение нарушения ограничения.Есть причина, почему это так?Все вышеприведенные операторы выполняются в рамках одной транзакции.

Вот как Hibernate ведет себя конструктивно, он вставляет значения в save() раз (A1, B1, C1) и затем обновляет их (C1до C2), он не будет вставлять A1, B1, C2).Цитируя короля в Вставьте и обновите в том же местеданные, которые были установлены при вызове save ().Это дает пользователю немного более точный контроль, особенно в контексте, где есть триггеры и т. Д. Однако, если вы не будете осторожны, он может работать плохо.

Предложение: отложить сохранение для вставки (A1, B1, C2) напрямую.

3 голосов
/ 19 августа 2010

Попробуйте использовать session.flush () после обновления.

...