JPA - Переопределить проверку бина в наследовании объединенной стратегии

У меня есть три объекта JPA: A, B и C. B и C наследуют A с объединенной стратегией. Можно ли переопределить ограничение Bean Validation в подклассах? Например, я бы хотел, чтобы B имел ограничение @NotNull в одном поле, а C - ограничение @Null в том же поле.

Я думал сделать это, используя группы Bean Validation, однако я не знаю, как определить, что B должен проверяться в одной группе, а C - в другой.

Код для иллюстрации проблемы:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
...
public abstract class A {
    ...
    @Column(name="FIELD")
    private Integer field;
    ...
}

@Entity
public class B extends A {
    ...
    //@NotNull in field
    ...
}

@Entity
public class C extends A {
    ...
    //@Null in field
    ...
}

2 ответа

Я думаю, что пришел к решению, читающему этот другой вопрос об условной валидации бина: условная валидация бина.

Это все еще не проверено, но я думаю, что это могло бы работать.

Код решения:

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
...
public abstract class A {
    ...
    @Column(name="FIELD")
    private Integer field;
    ...
}

@Entity
public class B extends A {
    ...
    @Transient
    @AssertTrue
    private boolean isValidClassA() {
        return (getField() != null); //Validates NotNull
    }
    ...
}

@Entity
public class C extends A {
    ...
    @Transient
    @AssertTrue
    private boolean isValidClassA() {
        return (getField() == null); //Validates Null
    }
    ...
}

Если вам нужна эта проверка во время операции сохранения или слияния, почему бы вам не определить обратные вызовы pre-prestist/update?

public class Base {

  protected String myData;
}

public class ConcreteA {

  @PrePersist
  @PreUpdate
  private void checkDataNotNull() {
    assert(mydata).isNotNull();
  }
}

public class ConcreteB {

  //myData may be null, so dont do any check
}

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

Другие вопросы по тегам