JPA-覆盖联接策略继承中的bean验证
我有三个JPA实体:A、B和C。B和C继承了一个联合策略。是否可以覆盖子类中的Bean验证约束?例如,我希望B在一个字段中有@NotNull约束,而C在同一个字段中有@Null约束 我想通过使用Bean验证组来实现这一点,但是我不知道如何定义B必须用一个组进行验证,C必须用另一个组进行验证 用于说明问题的代码:JPA-覆盖联接策略继承中的bean验证,jpa,inheritance,overriding,bean-validation,joined-subclass,Jpa,Inheritance,Overriding,Bean Validation,Joined Subclass,我有三个JPA实体:A、B和C。B和C继承了一个联合策略。是否可以覆盖子类中的Bean验证约束?例如,我希望B在一个字段中有@NotNull约束,而C在同一个字段中有@Null约束 我想通过使用Bean验证组来实现这一点,但是我不知道如何定义B必须用一个组进行验证,C必须用另一个组进行验证 用于说明问题的代码: @Entity @Inheritance(strategy=InheritanceType.JOINED) ... public abstract class A { ...
@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
...
}
我想通过阅读关于条件bean验证的另一个问题,我找到了一个解决方案: 它仍然没有经过测试,但我认为它可以工作 解决方案代码:
@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-prersist/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
}
如果数据为null,则可以保证数据不会保存到ConcreteA的数据库中,并且会引发错误。
如果字段不为空,您不再需要手动检查该字段。将属性字段移动到B和C并不容易?不,因为我在查询实体时需要它。