2014-02-06 4 views
0

У меня есть два типа спящего режима: заказ и его элементы (один-ко-многим с каскадом save-update, ничего особенного).Hibernate one-to-many sql order order

Два пользователя инициируют обновление одного и того же заказа путем добавления нового элемента в то же самое время, которое запускает операцию Session.saveOrUpdate (order) в двух параллельных потоках.

Оба заказа и элемента имеют столбец @Version для поддержки оптимистичной блокировки, поэтому это параллельное редактирование завершается с ошибкой OptimisticLockException, как и предполагалось.

Затем я хочу увеличить согласованность базы данных и добавить уникальное ограничение к элементу (в одном из своих столбцов).

Повторяя приведенный выше случай, я получаю нарушение ограничений вместо OptimisticLockException!

Похоже, спящий режим делает это: (! Ограничение voilation)

  • ВСТАВИТЬ новый элемент в элемент таблицы
  • проверка оптимистичным замок
  • стол

порядок UPDATE Можно ли заставить Hibernate проверять оптимистичную блокировку ПЕРЕД добавлением дочерних элементов?

ответ

0

НЕВОЗМОЖНО изменить порядок INSERT/UPDATE. Hibernate имеет очередь действий, где INSERT всегда находится перед любым UPDATE.

Подробности приведены в org.hibernate.engine.spi.ActionQueue.executeActions method. Единственный способ устранить проблему выше - удалить каскадное сохранение: обновить родительский объект, а затем добавить дочерние элементы.

0

Мы можем поймать исключение оптимистического блокирования (JPA) или StaleObjectStateException для одновременных обновлений с использованием управления версиями и обработать их на основе использования. Либо мы можем перезагрузить последний объект и сохранить его, либо перенаправить обратно для действий пользователя.