Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA-覆盖联接策略继承中的bean验证_Jpa_Inheritance_Overriding_Bean Validation_Joined Subclass - Fatal编程技术网

JPA-覆盖联接策略继承中的bean验证

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 { ...

我有三个JPA实体:A、B和C。B和C继承了一个联合策略。是否可以覆盖子类中的Bean验证约束?例如,我希望B在一个字段中有@NotNull约束,而C在同一个字段中有@Null约束

我想通过使用Bean验证组来实现这一点,但是我不知道如何定义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
    ...
}

我想通过阅读关于条件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并不容易?不,因为我在查询实体时需要它。