【发布时间】:2015-03-06 19:21:30
【问题描述】:
鉴于Play Framework 2.3 Computer Database sample application,我想练习在属性上添加唯一约束。假设我希望 Computer 类的 name 属性是唯一的。我试图通过向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;
}
在数据库中创建新记录时,此检查有效,但是,当您更新计算机对象但不更改名称时,这会导致验证错误。有没有办法添加uniqueness constraint, similar to Rails?如何在 Play 中验证唯一性?
谢谢!
更新:见answer by davide。
我最终使用了 javax.persistence API 中的 @Column(unique = true) 约束。这不会在 Play 表单中产生错误;相反,它会抛出一个PersistenceException。因此,我必须添加更改我的控制器以实现我想要的行为。 create() 和 update() 操作都需要这样的 try/catch:
try {
computerForm.get().save();
} catch (PersistenceException pe) {
flash("error", "Please correct errors below.");
formData.reject("name", "Name conflict. Please choose a different name.");
return badRequest(createForm.render(computerForm));
}
更新 2:以下每个答案都是可能的解决方案
【问题讨论】:
-
PersistenceException对于这个恕我直言来说太宽泛了,但这是你的选择 -
@biesior 这是一个很好的观点。我想这不是最好的解决方案。你会建议捕获一个不同的异常吗?
标签: forms playframework playframework-2.3