Hibernate 如何对唯一复合密钥进行验证检查

Hibernate 如何对唯一复合密钥进行验证检查,hibernate,validation,jpa,playframework,Hibernate,Validation,Jpa,Playframework,我想通过扩展play.data.validation.check来定义我自己的检查约束,这样我就可以显示自定义的验证消息 然而,检查似乎只适用于一个字段。 是否有其他方法对多个字段执行此验证检查 更新-解决方案 @Entity @Table(uniqueConstraints = @UniqueConstraint(columnNames = { "field1", "field2"})) public class A extends Model{ public String field1

我想通过扩展play.data.validation.check来定义我自己的检查约束,这样我就可以显示自定义的验证消息

然而,检查似乎只适用于一个字段。 是否有其他方法对多个字段执行此验证检查

更新-解决方案

@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "field1", "field2"}))
public class A extends Model{

  public String field1;
  public String field2;
}

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

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


不,只玩,让我们分别验证每个字段。但是,您可以创建自己的复合字段,该字段包含在单独的类中,并将其添加到主对象中,例如:

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

然后对其应用自定义验证程序(更多相关内容)

我认为不能将Hibernate验证库添加到Play项目中。
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;

}