Как сделать проверку на уникальный составной ключ - PullRequest
0 голосов
/ 18 января 2012
@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 ]

1 голос
/ 18 января 2012

Ну нет, играть только, вы можете проверить на каждом поле в отдельности. Однако вы можете создать собственное составное поле, которое содержится в отдельном классе, и добавить его к своему основному объекту, например:

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;

}

и затем примените к нему пользовательский валидатор (подробнее о них здесь )

1 голос
/ 18 января 2012

Использование аннотаций JPA гарантирует, что вы не можете поместить неверные данные в базу данных, но не строго говоря проверки.Вы бы просто получили исключение.

Я бы взглянул на Hibernate Validator.Это позволяет проводить проверку одного поля из коробки, и вы можете реализовать свои собственные аннотации для выполнения более сложных сценариев.Он также является эталонным имплементацией Bean Validation JSR-303.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...