Spring JPA 不在更新时验证 bean
Spring JPA doesn't validate bean on update
我正在使用 Spring Boot 1.5.7,Spring JPA,Hibernate 验证,Spring Data REST,Spring HATEOAS。
我有一个像这样的简单 bean:
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
@NotBlank
private String name;
}
如您所见,我正在使用@NotBlank。根据 Hibernate 文档,应该在预持久和预更新时进行验证。
我创建了一个 junit 测试:
@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {
Person person = new Person();
person.setName("");
personRepository.save(person);
}
此测试工作正常,因此验证过程正确进行。而在这个测试用例中,验证不起作用:
@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {
Person person = new Person();
person.setName("Name");
personRepository.save(person);
person.setName("");
personRepository.save(person);
}
我找到了另一个 similar question 但不幸的是没有任何回复。
为什么不对 update() 方法进行验证?解决问题的建议?
我认为 ConstraintViolationException 不会发生,因为在更新期间 Hibernate 不会当场将结果刷新到数据库。尝试将测试中的 save() 替换为 saveAndFlush()。
您是否正在使用 Spring Boot JPA 测试?如果是,saveWithEmptyNameThrowsException
被包裹在一个事务中,并且在方法执行完成之前不会提交。换句话说,该方法被视为一个工作单元。调用personRepository.save
(除非您启用自动commit/flush 更改)将不会反映您的实体更改,但直到提交事务。这是您测试的解决方法:
@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {
// Wrap the following into another transaction
// begin
Person person = new Person();
person.setName("Name");
personRepository.save(person);
// commit
// Wrap the following into another transaction
// begin
person = ... get from persistence context
person.setName("");
personRepository.save(person);
// commit
}
您可以使用 TransactionTemplate
在 Spring 中进行编程事务划分。
我正在使用 Spring Boot 1.5.7,Spring JPA,Hibernate 验证,Spring Data REST,Spring HATEOAS。
我有一个像这样的简单 bean:
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
@NotBlank
private String name;
}
如您所见,我正在使用@NotBlank。根据 Hibernate 文档,应该在预持久和预更新时进行验证。
我创建了一个 junit 测试:
@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {
Person person = new Person();
person.setName("");
personRepository.save(person);
}
此测试工作正常,因此验证过程正确进行。而在这个测试用例中,验证不起作用:
@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {
Person person = new Person();
person.setName("Name");
personRepository.save(person);
person.setName("");
personRepository.save(person);
}
我找到了另一个 similar question 但不幸的是没有任何回复。 为什么不对 update() 方法进行验证?解决问题的建议?
我认为 ConstraintViolationException 不会发生,因为在更新期间 Hibernate 不会当场将结果刷新到数据库。尝试将测试中的 save() 替换为 saveAndFlush()。
您是否正在使用 Spring Boot JPA 测试?如果是,saveWithEmptyNameThrowsException
被包裹在一个事务中,并且在方法执行完成之前不会提交。换句话说,该方法被视为一个工作单元。调用personRepository.save
(除非您启用自动commit/flush 更改)将不会反映您的实体更改,但直到提交事务。这是您测试的解决方法:
@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {
// Wrap the following into another transaction
// begin
Person person = new Person();
person.setName("Name");
personRepository.save(person);
// commit
// Wrap the following into another transaction
// begin
person = ... get from persistence context
person.setName("");
personRepository.save(person);
// commit
}
您可以使用 TransactionTemplate
在 Spring 中进行编程事务划分。