更新(合并)时缺少Spring Data JPAvalidation

我正在使用Spring Data JPA的Spring boot 1.5.4.RELEASE开发项目。

问题是在更新实体时没有执行Hibernatevalidation器,或者至少在某些情况下它没有validation。

对于像下面这样的 ,禁止使用空名称和技能集合必须具有最小1个元素和最大5个。在Spring Data存储库的调用保存期间,它们都被validation。 但是,对于已存在的实体的呼叫保存,它将仅validation名称的约束 – 并且不会检查技能。

@Entity public class Person { @Id @GeneratedValue private Long id; @NotBlank private String name; @ElementCollection(fetch = FetchType.EAGER) @Size(min = 1, max = 5) private Set skills = new HashSet(); protected Person() { } public Person(final String name, final Collection skills) { this.name = name; this.skills.addAll(skills); } public void updateSkills(Collection skills) { this.skills.clear(); this.skills.addAll(skills); } public void updateName(final String name) { this.name = name; } //getters } 

当创建具有空技能列表的新实体时,它将按预期抛出ConstraintValidationException:

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

https://github.com/konczak/demo-skills-validation-issue/blob/master/src/test/java/com/example/demo/entity/PersonTest.java#L80

然而,当做同样的事情 – 在实体更新上存储空列表(合并发动机舱?不确定)它将通过,而我会期望exception:

 @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 } 

https://github.com/konczak/demo-skills-validation-issue/blob/master/src/test/java/com/example/demo/entity/PersonTest.java#L104

我用手动创建的validation器编写了测试并validation了这样的Person,并且正如预期的那样,它返回1个ConstraintViolation用于字段技能:

https://github.com/konczak/demo-skills-validation-issue/blob/master/src/test/java/com/example/demo/entity/PersonTest.java#L119

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

https://github.com/konczak/demo-skills-validation-issue

我知道在瞬态和附加/分离实体的保存方法下存在差异,但我仍然希望validation更新/合并。 再次奇怪的是,它将在更新时validation字段名称的空白值 – 它会抛出不同的exception但原始原因是ConstraingViolationException。

https://github.com/konczak/demo-skills-validation-issue/blob/master/src/test/java/com/example/demo/entity/PersonTest.java#L91

在这种情况下我错过或误解了什么?