Java 玩唯一模型字段

Java 玩唯一模型字段,java,validation,playframework,Java,Validation,Playframework,如何使模型类字段唯一?如果已经登录,我想为用户显示正确的消息。我必须编写自己的验证检查并使用它,否则可以使用JPA@UniqueConstraint?我是这样做的: @Entity public class User extends Model { @Basic(optional=false) @Column(unique=true) public String name; public User(String name) { this.name = name

如何使模型类字段唯一?如果已经登录,我想为用户显示正确的消息。我必须编写自己的验证检查并使用它,否则可以使用JPA
@UniqueConstraint

我是这样做的:

@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()检查的情况下执行此操作,您将得到一个ConstraintViolationException,但它当然不是非常友好的用户界面。您也可以尝试/捕获该异常。我喜欢这两种方式,用户友好且数据库一致。

您必须自己写支票。看见
我几个月前写的,不幸的是我现在没有时间玩。

我通过在crud控制器中重写create方法来完成这一点,就像这样。在validaiton.hasErrors()方法之前调用自定义validateUniqueFields方法。然后,我可以返回唯一字段的有效错误

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");
    }
}
publicstaticvoidcreate()引发异常
{
ObjectType=ObjectType.get(getControllerClass());
notFoundIfNull(类型);
构造函数=type.entityClass.getDeclaredConstructor();
constructor.setAccessible(true);
模型对象=(模型)构造函数.newInstance();
Binder.bindBean(params.getRootParamNode(),“object”,object);
有效(对象);
验证Euniquefields(对象);
if(validation.hasErrors()){
renderArgs.put(“error”、play.i18n.Messages.get(“crud.hasErrors”);
试一试{
呈现(request.controller.replace(“.”,“/”+“/blank.html”),类型,对象);
}捕获(TemplateNotFounde异常){
呈现(“CRUD/blank.html”,类型,对象);
}
}
对象。_save();
success(play.i18n.Messages.get(“crud.created”,type.modelName));
if(params.get(“\u save”)!=null){
重定向(request.controller+“.list”);
}
if(params.get(“\u saveandaddother”)!=null){
重定向(request.controller+“.blank”);
}
重定向(request.controller+“.show”,object._key());
}
私有静态void validateUniqueFields(模型对象){
字符串值=((CastModelHere)对象);
字符串ident=“identifier”;
if(TUCharacterTypeIdentifier.find(ident,value).first()!=null)
{
validation.addError(“object.+ident,ident+“已获取”);
}
}

我也在考虑捕获异常,但我认为这有点“不整洁”。我已经做了一些类似于你们建议的事情,但我仍然缺少模型中的唯一性,所以我将添加这一点以保持一致。