Forms Play Framework 2.3如何向示例应用程序添加唯一约束

Forms Play Framework 2.3如何向示例应用程序添加唯一约束,forms,playframework,playframework-2.3,Forms,Playframework,Playframework 2.3,鉴于此,我想练习在属性上添加唯一约束。假设我希望计算机类的名称属性是唯一的。我试图通过向Computer.java添加validate()函数(和getter)来实现这一点: public List<ValidationError> validate() { List<ValidationError> errors = new ArrayList<ValidationError>(); if(Computer.find.where().eq

鉴于此,我想练习在属性上添加唯一约束。假设我希望
计算机
类的
名称
属性是唯一的。我试图通过向
Computer.java添加
validate()
函数(和getter)来实现这一点:

public List<ValidationError> validate() {

    List<ValidationError> errors = new ArrayList<ValidationError>();

    if(Computer.find.where().eq("name", getName()).findRowCount() != 0){
        errors.add(new ValidationError("name", "Name must be unique. That value is already taken."));
    }

    return errors;
}

public String getName() {
    return name;
}

更新2:下面的每个答案都是可能的解决方案

我不确定这是否回答了您的问题,因为我不熟悉Ruby语法

要“在数据库中创建唯一性约束”,可以使用。埃宾也会认识到这一点

要具有涉及单个字段的普通唯一性约束,可以使用:

如果您需要一些字段组合是唯一的,请使用


我希望有帮助

您需要从唯一性检查中排除当前实体,例如:

if(Computer.find.where().eq("name", getName()).ne("id", getId()).findRowCount() != 0){
     errors.add(new ValidationError("name", "Name must be unique."));
}
它将在更新期间为您提供SQL查询:

select count(*) from computer t0 where t0.name = 'Foo' and t0.id <> 123 
p.S.
ne()
表达式表示不等于,当然,这种方法假定您的
名称
字段是
必填项

编辑:我向您发送了带工作解决方案的拉取请求,您只需在
editForm
中添加隐藏字段,如:

<input name="id" type="hidden" value='@computerForm("id").value'/>


另一件事是,您可以简化您的模型,即不需要公共字段的getter。

我尝试了这一点,问题是即使在更新时,从请求绑定的数据也没有
id
,因此
getId()
if
语句中始终为空。尝试将这一行放在
if
之前,您将看到我所说的:
Logger.debug(“当前id:+getId())和往常一样,在发布这个答案之前,我测试了这个方法(在其他项目上,而不是在计算机样本上),结果还行。将其发布到某个地方(即临时Github repo),以便我可以检查出什么问题。检查编辑并拉取请求,一个小的更改就可以使其工作是的,我已经尝试放置
@列(unique=true)
,但是这会在数据库级别引发错误,并且在填写播放表单时不会生成验证错误,这就是我所需要的。我通常做的是将保存或更新包装在一个try-catch块中,捕获引发的异常,然后我重定向回表单,使用flash作用域发出错误信号
PersistenceException
对于这个IMHO来说太宽了,但这是您的问题choice@biesior这是一个很好的观点。我想这不是最好的解决办法。您是否建议捕获其他异常?
if(Computer.find.where().eq("name", getName()).ne("id", getId()).findRowCount() != 0){
     errors.add(new ValidationError("name", "Name must be unique."));
}
select count(*) from computer t0 where t0.name = 'Foo' and t0.id <> 123 
select count(*) from computer t0 where t0.name = 'Foo' and t0.id is not null 
<input name="id" type="hidden" value='@computerForm("id").value'/>