我正在使用带有Spring Data JPA的Spring boot 1.5.4.RELEASE进行项目。
问题是在更新实体时没有执行Hibernate验证器,或者至少在某些情况下它没有验证。
对于人,如下所示,禁止使用空名称,技能收集必须包含最小1个元素和最多5个元素。 在Spring Data存储库上调用 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
}
当创建具有空技能列表的新实体时,它将按预期抛出ConstraintValidationException:
@Test(expected = ConstraintViolationException.class)
public void shouldFailWhenSkillsAreEmpty() {
//given
Person person = new Person("gucio", Collections.EMPTY_LIST);
//when
personRepository.save(person);
//then
}
然而,当做同样的事情 - 在实体更新中存储空列表(合并发动机舱?不确定)它会通过,而我会期望异常:
@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
}
我用手动创建的验证器编写了测试并验证了这样的Person,并且正如预期的那样,它为场技能返回1 ConstraintViolation:
您可以轻松查看示例项目:
https://github.com/konczak/demo-skills-validation-issue
我知道瞬态和附加/分离实体的保存方法存在差异,但我仍然希望验证更新/合并。 再次奇怪的是,它将在更新时验证字段名称的空白值 - 它会抛出不同的异常但原始原因是ConstraingViolationException。
在这种情况下我错过或误解了什么?