При добавлении записи из веб-приложения Grails я получаю исключение NonUniqueObjectException. Это происходит потому, что пользователь веб-приложения может добавлять записи, и одним из полей, которые они заполняют, является PrimaryKey таблицы объекта / таблицы базы данных. Hibernate проверит базу данных, чтобы увидеть, существует ли запись с таким идентификатором, как только объект домена создан (AFAIK). Таким образом, он выдает эту ошибку, когда находит конфликт.
Моей первой реакцией было добавление нового поля PK в объект, о котором пользователь не знает, например, GUID. Хотя это работает для многих из имеющихся у нас объектов домена, у нас также есть некоторые объекты домена, которые указывают на устаревшие таблицы, которые нельзя изменить. Это делает добавление столбца нецелесообразным для этой цели.
Следующее решение, которое у меня есть, это проверить идентификатор, который пользователь передает в веб-приложение, и проверить, существует ли он уже. Если оно существует, передайте доброе сообщение, информирующее их о том, что запись уже существует. Это решение определенно будет работать, но идет вразрез с моделью наличия всех ограничений на объект домена. Это также может быть сделано в try / catch для получения аналогичного результата.
У меня вопрос: могу ли я отложить переход в спящий режим от проверки, если объект уже существует в базе данных, до времени сохранения? Доменный объект имеет уникальное ограничение, и это ограничение будет нарушено во время сохранения и позволит вызвать сообщение messages.properties. Кроме того, любые другие идеи будут оценены.
UPDATE:
Я допустил ошибку в первоначальном посте. Ошибка вызывается при вызове сохранения. Однако это указывает на другую проблему. Кажется, что уникальное ограничение на объект домена не вызывается. Объект домена каким-то образом проходит проверку, хотя «уникальный» является частью идентификатора домена. Означает ли это, что ограничение «уникальное» для поля идентификатора объекта домена не проверяется так же, как и для других объектов?