2015-12-04 7 views
1

Я начинаю с игры! Framework 2 и я столкнулся с проблемой при попытке сохранить объект в базе данных (Postgres).Избегайте дублирования ключевой ошибки при сохранении объекта

Я создал модель, где есть аннотация @Column(unique = true) по атрибуту name. Таким образом, при сохранении должны быть два уникальных атрибута: идентификатор, который всегда правильно сгенерирован, и имя, которое является вводом, предоставленным пользователем.

Когда я проверяю ошибки в контроллере (filledForm.hasErrors()), ошибок нет, потому что (я думаю) он не проверяет дублированные атрибуты, а только для ошибок формы.

Затем он переходит к Модели и пытается сохранить объект thebean.save();. И затем он «сбой» и показывает ошибку в браузере.

Мой вопрос: поскольку метод save() возвращает void, как я могу поймать эту ошибку и узнать, какая она ошибка (чтобы предупредить пользователя)?

Thanks

+0

Как это «сбой»? Вызывает ли это исключение? Что такое сообщение об ошибке? – Kris

+0

На самом деле, крушение это был просто способ сказать. При отладке я мог видеть, что он генерирует исключение PersistenceException. Я знаю, что могу контролировать это, создавая метод и проверяя параметр 'name' вручную в контроллере, но мне интересно, есть ли у фреймворка уже метод проверки этого автоматически, как' hasErrors() 'делает в форме. – Laerte

+0

Не было бы достаточно использовать try {} catch {}, чтобы поймать PersistenceException? – Kris

ответ

1

Альтернативное решение - это ручное ограничение проверки. Существует метод сущности, называемый validate() (в моделях). Он автоматически вызывается, когда форма проверяется. Итак:

public List<ValidationError> validate() { 
    List<ValidationError> errors = new ArrayList<>(); 

    if(YouModel.find.where().eq("name", name).ne("entity_id", entity_id).findRowCount() != 0){ 
     errors.add(new ValidationError("name", "error.yourModel.name.unique")); 
     return errors; 
    } 

    return null; 
} 

error.yourModel.name.unique обычай константа из/конф файле/сообщений. Вы должны создать его.

+0

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