Играть!- уникальное модельное поле - PullRequest
2 голосов
/ 30 мая 2011

Как сделать поля класса модели уникальными? Например. если вход в систему уже выполнен, я хотел бы отобразить правильное сообщение для пользователя. Я должен написать свою собственную проверку и использовать ее, или JPA @UniqueConstraint можно использовать?

Ответы [ 3 ]

5 голосов
/ 31 мая 2011

Я сделал это следующим образом:

@Entity
public class User extends Model {

    @Basic(optional=false) @Column(unique=true) public String name;

    public User(String name) {
        this.name = name;
        create();
    }

    /** used in registration to find name clash */
    public static User findByName(String name) {
        return find("name", name).first();
    }

}

и затем в контроллере вы делаете что-то вроде:

public static void register(@Required String name) {
    if(User.findByName(name)!=null) {
        Validation.addError("name", "this name is not available");
    }
    if (validation.hasErrors()) {
        validation.keep();
        params.flash();
        flash.error("Please correct the form data.");
        signup(); // whatever your GET action was
    }

    User user = new User(name);
    login(); // whatever your success action is
}

вы можете сделать это без проверки User.findByName ()и вы получите ConstrainViolationException, но это, конечно, не очень удобно для пользователя.Вы также можете просто попробовать / поймать это исключение.Я предпочитаю это обоим способом, потому что удобен и последовательн в базе данных.

2 голосов
/ 31 мая 2011

Вы должны написать свой чек. Смотри http://bazaar.launchpad.net/~opensource21/+junk/permsec/files/head:/app/de/ppi/util/validation/ Я написал это несколько месяцев назад, к сожалению, на данный момент у меня нет времени играть.

0 голосов
/ 20 мая 2012

Я выполняю это, переопределяя метод create в моих контроллерах crud следующим образом. Вызов пользовательского метода validateUniqueFields непосредственно перед методом validaiton.hasErrors (). Затем я могу вернуть действительные ошибки для своих уникальных полей.

public static void create() throws Exception 
{
    ObjectType type = ObjectType.get(getControllerClass());
    notFoundIfNull(type);
    Constructor<?> constructor = type.entityClass.getDeclaredConstructor();
    constructor.setAccessible(true);
    Model object = (Model) constructor.newInstance();
    Binder.bindBean(params.getRootParamNode(), "object", object);
    validation.valid(object);
    validateUniqueFields(object);
    if (validation.hasErrors()) {
        renderArgs.put("error", play.i18n.Messages.get("crud.hasErrors"));
        try {
            render(request.controller.replace(".", "/") + "/blank.html", type, object);
        } catch (TemplateNotFoundException e) {
            render("CRUD/blank.html", type, object);
        }
    }
    object._save();
    flash.success(play.i18n.Messages.get("crud.created", type.modelName));
    if (params.get("_save") != null) {
        redirect(request.controller + ".list");
    }
    if (params.get("_saveAndAddAnother") != null) {
        redirect(request.controller + ".blank");
    }
    redirect(request.controller + ".show", object._key());
}

private static void validateUniqueFields(Model object) {
    String value = ((CastModelHere)object).identifier;
    String ident = "identifier";
    if( TUCharacterTypeIdentifier.find(ident, value).first() != null )
    {
        validation.addError("object." + ident, ident + " already taken");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...