#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-инструмента.