Повторный ввод значения для unique атрибута

Атрибут сущности имеет ограничение Unique


    @Column(name = "EMAIL", unique = true)
    protected String email;

С веб-клиента создается запись, нарушающая это ограничение. При попытке коммита клиенту бросается исключение PSQLException:


PSQLException: ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "blablabla_uniq_email"
  Подробности: Ключ "(email)=(q@qq.ru)" уже существует.

Требуется обработать это исключение.

Варианта вижу два:

  • В контроллере экрана в методе preCommit проверять наличие повторов поиском по коллекции либо прямым JBQL-запросом, и если повторы найдены - прерывать коммит с соответсвующим сообщением
  • поймать где-то исключение PSQLException и обработать, отобразив "человеческое" сообщение об ошибке

Первый вариант мне кажется костылем. Второй вариант - не знаю как реализовать.
Подскажите как это делается правильно.

Здравствуйте Игорь.
Второй вариант можно реализовать с использованием следующего свойства:


cuba.uniqueConstraintViolationPattern

Почитать про него можно здесь.

Глеб, я находил в документации это свойство, но, к сожалению, не понял как его использовать. Как ловить исключение, где его обрабатывать… Можете объяснить решение чуть более подробно?

Добрый день, Игорь!
Во вложении находится тестовый проект с примерами использования cuba.uniqueConstraintViolationPattern для HSQLDB и Postgres (рус.). Обратите внимание на файл web-app.properties (находящийся в модуле web)

 
cuba.uniqueConstraintViolationPattern = ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "(.+)"  



и файлы локализации находящиеся в главном пакете приложения модуля web (com.company.ut.web).
messages.properties

  
IDX_UT_PERSON_UNIQ_NAME = That name is already taken  



messages_ru.properties

  
IDX_UT_PERSON_UNIQ_NAME = Это имя уже занято  



Обратите внимание, что для Postgres Вам возможно придется ввести свои данные для сервера (адрес, логин, пароль) в экране настройки проекта в CUBA Studio.

unique-test.zip (17.8K)

Глеб, спасибо большое за пример. Все работает.

Следует только добавить, что

IDX_UT_PERSON_UNIQ_NAME

это наименование индекса, по которому возникает исключение, и найти его можно в файле 20-create-db.sql в /app-core/db/init/postgres