Нарушение ограничения UNIQUE KEY.Невозможно вставить дубликат ключа в объект - PullRequest
0 голосов
/ 13 февраля 2012

Мы пытаемся увеличить объем совместимости базы данных для нашего веб-приложения.Наше приложение - это Java EE с JSP, сервлетами и EJB.База данных, с которой мы пытаемся сделать наше приложение совместимым, - это SQL Server 2008.

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

Violation of UNIQUE KEY constraint 'UQ__Key__8861A9F23EDC53F0'. Cannot insert duplicate key in object 'dbo.Entity'. org.hibernate.exception.ConstraintViolationException: could not insert: [foo.beans.eproc.entity.Entity]

До сих пор мы пытались решить эту проблему следующим образом:

  1. Добавление конструкторов к объектамкоторые поддерживают ограничение UQ Key, чтобы инициализировать записи как уникальные и ненулевые.Это решило предыдущие проблемы с другими основными нарушениями ограничений.
  2. Мы читали о проблеме с Hibernate, выполняющей INSERTS перед DELETES.Ранее мы думали, что это может быть причиной проблемы.В настоящее время в рамках процесса обновления все сохраненные вложения удаляются, а все текущие вложения в сеансе добавляются в базу данных.Мы думали, что если он действительно попытается выполнить INSERTS перед DELETES, то это вызовет нарушение ключа UQ с вложениями.
  3. Если мы просто удалим ключи UQ в SQL Server и добавим второе вложение,Обновление базы данных происходит без проблем, и в записях, по-видимому, отсутствуют неуникальные данные.

К сожалению, приведенный выше [1] не решил проблему, поскольку нарушение ключа UQ все еще продолжается.выброшены.Для [2] выше, мы не смогли проверить, что Hiberante выполняет INSERTS перед удалением.

Ответы на следующие вопросы помогут нам добиться некоторого прогресса:

  1. Можетудаление уникальных ключей в SQL-сервере может стать потенциальным решением этой проблемы?
  2. Есть ли способ убедиться, что Hibernate выполняет или не выполняет INSERTS перед удалением?Если да, то как мы можем это проверить?
  3. Если в указанном выше случае есть проблема с Hibernate, как мы можем решить эту проблему?

1 Ответ

1 голос
/ 13 февраля 2012

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

2) Существуют инструменты мониторинга nhibernate, но,Есть также инструменты мониторинга TSQL.Если вы используете SQL SErver 2008 или лучше, запустите расширенный сеанс событий и захватывайте запросы, вызываемые через события rpc complete и sql batch complete.SQL Server 2005 и более ранних версий вы можете сделать то же самое с трассировкой на стороне сервера, настроенной через Profiler.

3) Не достаточно хорошо знаете Hibernate, чтобы комментировать, извините.

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