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, если она пуста, и возникнет ошибка. Вам больше не нужно вручную проверять поле, если оно не равно нулю вручную.