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'/>