Можно ли настроить CRUD-модуль Play Framework для учета аннотаций @Column (unique = true)? - PullRequest
7 голосов
/ 24 мая 2011

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

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

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 И аннотации уникальности столбцов?

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

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

public class UniqueCheck extends Check {

    @Override
    public boolean isSatisfied(Object validatedObject, Object value) {
        if (StringUtils.isBlank((String) value)) {
            return false;
        }
        return User.findByEmail((String) value));
    }

}

Тогда

public class User extends Model {

@Email
@Required
@MaxSize(value = 250)
@CheckWith(value = UniqueEmail.class, message = "Existing account has been found with this e-mail")
public String email;

}
0 голосов
/ 01 июля 2011

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

...