Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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
Java 更新(合并)时缺少Spring数据JPA验证_Java_Spring_Hibernate_Spring Data Jpa_Bean Validation - Fatal编程技术网

Java 更新(合并)时缺少Spring数据JPA验证

Java 更新(合并)时缺少Spring数据JPA验证,java,spring,hibernate,spring-data-jpa,bean-validation,Java,Spring,Hibernate,Spring Data Jpa,Bean Validation,我正在从事SpringBoot1.5.4.RELEASE和SpringDataJPA的项目 在更新实体时并没有执行Hibernate验证器,或者至少在某些情况下它并没有进行验证,这一问题一直存在 对于个人如下图所示,禁止使用空名称,技能集合必须至少包含1个元素,最多包含5个元素。 在Spring数据存储库的调用save过程中对这两个属性进行验证。然而,对于现有实体的调用保存,它将只验证名称约束,而不会检查技能 @Entity public class Person { @Id @

我正在从事SpringBoot1.5.4.RELEASE和SpringDataJPA的项目

在更新实体时并没有执行Hibernate验证器,或者至少在某些情况下它并没有进行验证,这一问题一直存在

对于个人如下图所示,禁止使用空名称,技能集合必须至少包含1个元素,最多包含5个元素。 在Spring数据存储库的调用save过程中对这两个属性进行验证。然而,对于现有实体的调用保存,它将只验证名称约束,而不会检查技能

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    @NotBlank
    private String name;

    @ElementCollection(fetch = FetchType.EAGER)
    @Size(min = 1, max = 5)
    private Set<String> skills = new HashSet<>();

    protected Person() {
    }

    public Person(final String name, final Collection<String> skills) {
    this.name = name;
    this.skills.addAll(skills);
    }

    public void updateSkills(Collection<String> skills) {
    this.skills.clear();
    this.skills.addAll(skills);
    }

    public void updateName(final String name) {
    this.name = name;
    }
    //getters
}

但是,当执行相同操作时-在实体更新时存储空列表(合并在引擎盖下?不确定),它将通过,而我预计会出现异常:

@Test(expected = ConstraintViolationException.class)
public void shouldFailWhenUpdateSkillsToEmpty() {
    //given
    Person person = new Person("gucio", Arrays.asList(JAVA, SQL));
    person = personRepository.save(person);
    person.updateSkills(Collections.EMPTY_LIST);
    //when
    personRepository.save(person);
    //then
}

我已经使用手动创建的验证器编写了测试,并验证了该人员,正如预期的那样,它返回1个现场技能约束:

您可以轻松查看示例项目:

我知道瞬态实体和附加/分离实体在save方法下存在差异,但我仍然希望对更新/合并进行验证。 同样奇怪的是,它将在更新时验证空白值的字段名-它引发不同的异常,但原始原因是ConstraintgViolationException


在这种情况下,我遗漏了什么或误解了什么?

您找到解决方案了吗?我也有同样的问题!对我来说,最简单的解决方案是将javax.validation.Validator(bean Validator)的实例注入到执行save的类中,执行验证方法并检查结果是否包含任何错误。实际问题在于github.com/hibernate/hibernate-orm/blob/5.0.12/hibernate-core/src/main/java/org/hibernate/cfg/beanvalidation/BeanValidationEventListener.java:112和传播的事件。如果集合发生更改,则PreDeleteEvent将操作组设置为删除。对于预删除,不执行验证。在Spring引导中,我可以设置这个Spring.jpa.properties.javax.persistence.validation.group.pre remove=javax.validation.groups.Default,删除验证的结果将与插入和更新相同,但异常是TransactionSystemException。
@Test(expected = ConstraintViolationException.class)
public void shouldFailWhenUpdateSkillsToEmpty() {
    //given
    Person person = new Person("gucio", Arrays.asList(JAVA, SQL));
    person = personRepository.save(person);
    person.updateSkills(Collections.EMPTY_LIST);
    //when
    personRepository.save(person);
    //then
}