如何对唯一复合键进行验证检查

时间:2012-01-18 11:25:11

标签: hibernate validation jpa playframework

@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;
        }
    }
 }

2 个答案:

答案 0 :(得分:1)

使用JPA注释将确保您不能将错误数据放入数据库,但严格来说不能验证。你会得到一个例外。

我想看看Hibernate Validator。它允许开箱即用的单场验证,您可以实现自己的注释来执行更复杂的场景。它也是Bean Validation JSR-303的参考实现。

http://www.hibernate.org/subprojects/validator.html

答案 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