@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "field1", "field2"}))
public class A extends Model{
public String field1;
public String field2;
}
我想通过扩展 play.data.validation.Check 来定义自己的检查约束,以便显示自定义验证消息。
然而,似乎Check仅适用于一个字段。 是否有其他方法可以对多个字段进行此验证检查?
更新 - 解决方案
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "field1", "field2"}))
public class A extends Model{
@CheckWith(UniqueFieldsCheck.class)
public String field1;
public String field2;
static class UniqueFieldsCheck extends Check {
public boolean isSatisfied(Object obj, Object o) {
boolean satisfied = true;
A a = (A)obj;
A aA = A.find("byField1AndField2", a.field1, a.field2).first();
if (aA != null) {
setMessage("This fields should be unique.");
satisfied = false;
}
return satisfied;
}
}
}
答案 0 :(得分:1)
使用JPA注释将确保您不能将错误数据放入数据库,但严格来说不能验证。你会得到一个例外。
我想看看Hibernate Validator。它允许开箱即用的单场验证,您可以实现自己的注释来执行更复杂的场景。它也是Bean Validation JSR-303的参考实现。
答案 1 :(得分:1)
嗯,不,只允许你在每个领域单独验证。但是,您可以创建自己的复合字段,它包含在一个单独的类中,并将其添加到主对象中,如:
public class A extends Model{
@CheckWith(value = UniqueUserCheck.class, message = "error.not.unique")
public ComplexField complexField;
}
public class ComplexField {
public String field1;
public String field2;
}
然后对其应用自定义验证器(更多关于那些here)