2010-08-19 1 views
4

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

Любые мысли или предложения?

ответ

3

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

+0

Может ли поддерживать связь, если я сфотографирую транзакцию? – Cshah

+0

У меня никогда не было проблем с этим. Я не помню, как это работает или что это делает, но вы можете найти объяснение по Java Persistence с Hibernate (именно там я узнал, что в первый раз я пытался это сделать). – Rafael

3

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

Вот как Hibernate ведет себя в соответствии с проектом, он будет вставить значения в save() времени (A1, B1, C1), а затем обновить их (C1-C2), он не вставит A1, B1, C2). Цитирование короля в Insert and Update in same flush:

Ожидаемое поведение Hibernate (мы обсуждали это, действительно ли правильно или нет!) В том, что оператор INSERT будет вставлять именно те данные, которые были установлены в момент сохранения() была вызвана. Это дает пользователю немного более тонкий контроль, особенно в контексте, где есть триггеры и т. Д. Однако, если вы не будете осторожны, это может сильно ухудшиться.

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

+0

Существует недопонимание. Порядок запроса: начало набора таблицы обновлений c = c2, где a = a1, b = b1, c = c1 insert into table (a1, b1, c1) commit Где-то в спящем режиме выполняется вставка до того, как обновление станет моим предположением. Я думаю, session.flush после того, как запрос на обновление решит – Cshah

+0

@Cshah Ahhhhhh, вы не обновляете «новую» запись, вы обновляете «существующую», получив ее сейчас. В этом случае используйте 'flush()' действительно, чтобы "заставить" обновление произойти. –

 Смежные вопросы

  • Нет связанных вопросов^_^