Hibernate - переименование объектов с уникальным ограничением - PullRequest
0 голосов
/ 25 августа 2009

Скажем, у вас есть куча объектов Article со свойством title. Тогда есть таблица ARTICLE со столбцом TITLE. Столбец TITLE имеет уникальное ограничение.

Пользовательский интерфейс отображает все статьи на одной странице с текстовым полем для редактирования заголовка.

Представьте себе ситуацию, когда у вас есть две статьи X & Y, X с заголовком «1» и Y с заголовком «2». На странице вы переименовываете Y в «2» и X в «1», затем отправляете форму. Если значения из формы скопированы непосредственно в объекты гибернации и сохранены, возникнет исключение ConstraintViolationException.

Это также происходит, если вы удалите статью «1» из коллекции, затем добавите другую статью с заголовком «1» и сохраните коллекцию.

Так, как лучше всего справиться с этой причудой Hibernate? У меня такое чувство, что я должен изменить интерфейс или что-то в этом роде. Проверка этих условий вручную перед сохранением объектов гибернации кажется немного громоздкой.

Ответы [ 2 ]

0 голосов
/ 25 августа 2009

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

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

Почему?

Похоже, что по крайней мере MySQL подпадает под это ограничение, как я обнаружил здесь , и, очевидно, не существует простого способа исправить это без серьезных потерь производительности.

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

Хотя это может стать волосатым. Представьте себе перестановку 3 экземпляров вместо двух. Например, «A», «B», «C» становится «B», «C», «A». Три шага? Что дальше?

0 голосов
/ 25 августа 2009

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

Посмотрите, закрывается или очищается объект Session между каждым запросом. В этом случае вам придется изменить оба экземпляра до закрытия / сброса.

РЕДАКТИРОВАТЬ: убедитесь, что вы прочитали следующий ответ, который я опубликовал.

...