Возможно ли настроить CRUD-модуль платформы Play для учета аннотаций @Column (уникальный = true)?

#hibernate #frameworks #playframework #crud #unique-constraint

#переход в спящий режим #фреймворки #playframework #crud #уникальное ограничение

Вопрос:

Я использую CRUD-модуль Play для создания простого набора экранов администратора. Одна из моих моделей — User, и я хочу применить уникальное ограничение к полю электронной почты.

Код выглядит следующим образом:

 public class User extends Model {
    @Email
    @Required
    @Column(unique=true)
    public String email;
  

Экран администратора отображается корректно — когда я пытаюсь нарушить уникальность (путем сохранения пользователя с уже использованным электронным письмом) Я получаю эту ошибку (в браузере):

 Execution exception
PersistenceException occured : org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

In {module:crud}/app/controllers/CRUD.java (around line 100)

96:
             } catch (TemplateNotFoundException e) {

97:
                 render("CRUD/show.html", type, object);

98:
             }

99:
         }


100:
         <b>object._save();</b>

101:
         flash.success(Messages.get("crud.saved", type.modelName));

102:
         if (params.get("_save") != null) {

103:
             redirect(request.controller   ".list");

104:
         }

105:
         redirect(request.controller   ".show", object._key());

106:
     }
  

Могу ли я внести какие-либо изменения для использования CRUD-модуля и аннотаций уникальности столбцов?

Ответ №1:

Вы можете создать пользовательскую проверку и добавить в свойство email в классе User.

проверка уникальности открытого класса расширяет проверку {

 @Override 
 удовлетворено общедоступное логическое значение (объект validatedObject, значение объекта) {
 если (StringUtils.isBlank((строковое) значение)) {
 возвращает false;
 } 
 верните User.findByEmail((строковое) значение));
 }

}

Затем

Пользователь открытого класса расширяет модель {

@Email
@Требуется
@MaxSize(значение = 250)
@CheckWith(значение = UniqueEmail.class, сообщение = "По этому электронному письму найдена существующая учетная запись")
общедоступная строка электронной почты;

}

Комментарии:

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

2. Проверьте поле id, если null, вы знаете, что это новая запись.

Ответ №2:

Мне кажется, что система делает именно то, что вы ожидали. Единственное, что я могу себе представить, это исправление CRUD-модуля, чтобы перехватить это исключение и быть более приятным, но обычно уникальные ограничения являются ограничениями на стороне базы данных и могут быть проверены только путем попытки записи в базу данных. Таким образом, ограничение уникальности не является аннотацией проверки (которая может быть выполнена перед записью в базу данных).

Комментарии:

1. Да, согласен, ограничение работает так, как я хотел. Это исправление в CRUD-модуле, поэтому я могу дать элегантный ответ пользователю, о котором мне интересно. Возможно, это выходит за рамки простого CRUD-инструмента.