簡體   English   中英

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文檔,驗證應該在pre-persist和pre-update上進行。

我創建了一個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);
}

我發現了另一個類似的問題,但遺憾的是沒有任何答復。 為什么不在update()方法上進行驗證? 建議解決問題?

我認為沒有發生ConstraintViolationException,因為在更新期間Hibernate不會在現場將結果刷新到數據庫。 嘗試使用saveAndFlush()替換測試save()。

你在使用Spring Boot JPA測試嗎? 如果是,則saveWithEmptyNameThrowsException包含在事務中,並且在方法執行完成之前不會提交。 換句話說,該方法被視為一個工作單元。 調用personRepository.save (除非啟用自動提交/刷新更改)將不會求助於實體更改的反映,而是在提交事務之前。 以下是測試的解決方法:

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

您可以在Spring中使用TransactionTemplate進行編程事務划分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM