我有一個表“MyService”,在兩列(命名空間和名稱)上具有唯一約束,Id 是 pk。| 姓名 | 型別 | | -------- | ------------- | | 編號 | 長 | | 命名空間 | 字串 | | 姓名 | 字串 | | 價值 | 字串 |
我想撰寫單元測驗以確保用戶不能插入具有相同(命名空間和值)的新行。所以我這樣編碼:
@Test
public void insertDuplicateTest() {
Service service1 = Service.builder().namespace("ns").name("n1").value("v1").build();
repository.saveAndFlush(service1);
Service service2 = Service.builder().namespace("ns").name("n1").value("v2").build();
repository.saveAndFlush(service2);
}
我有兩個問題:
- 據我了解,如果物體不存在,jparepository 將插入,如果存在則合并。那么為什么這會引發錯誤:
org.springframework.dao.DataIntegrityViolationException:無法執行陳述句;SQL [不適用];約束[uk5pg2rvcx3fsu5dctsm3pyqkh6];嵌套例外是 org.hibernate.exception.ConstraintViolationException:無法執行陳述句
- 如何完成此單元測驗以檢查是否存在錯誤或例外?
uj5u.com熱心網友回復:
據我了解,如果物體不存在,jparepository 將插入,如果存在則合并。那么為什么這會引發錯誤:
它將但存在的物體意味著存在具有相同主鍵的物體,其他列/屬性對此并不重要(無論是否唯一)。
當 JPA 嘗試插入它時拋出例外(因為主節點不存在)但由于UNIQUE違反約束而失敗。
如果您使用@GeneratedValue主鍵,它不會合并新創建的物件,而是為它們分配一個新的 id 并插入它們(由于UNIQUE約束而失敗)。
如果要合并物件,則需要使用不同的(非@GeneratedValue)主鍵或修改現有物件(如service1)。
如何完成此單元測驗以檢查是否存在錯誤或例外?
如果您希望出現例外,請使用assertThrows:
@Test
public void insertDuplicateTest() {
Service service1 = Service.builder().namespace("ns").name("n1").value("v1").build();
repository.saveAndFlush(service1);
Service service2 = Service.builder().namespace("ns").name("n1").value("v2").build();
assertThrows(DataIntegrityViolationException.class, () -> repository.saveAndFlush(service2);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/426032.html
