springboot jpa 無法更新 生成insert語句
昨天遇到一個問題,使用saveAndFlush無法更新一個實體
@PostMapping("/edit") public ResultVO edit(@RequestBody TCommodity commodity){ commodityRepository.saveAndFlush(commodity); return ResultVO.builder().code(1).message("").resultObject(commodity).build(); }
提交物件
{ "id":"4028338269a613820169a61406af0000", "commodityName":"百事可樂", "commodityDetails":"商品詳情", "specification":"箱", "specificationCount":"24", "smallestUnit":"瓶", "singlePrice":"300", "groupPrice1":"280", "groupPrice2":"250", "sellerArea":"北京市", "sellerEntity":{ "id":"37" } }
ID為主鍵,反覆檢查主鍵無誤,但是hibernate生成的確實insert語句
跟蹤原始碼後發現,save過程中檢查資料是否存在,根據主鍵ID
,還包括version。
@Version private Long version;
此時發現修改提交的實體中沒有version欄位,補上,提交成功
{ "id":"4028338269a613820169a61406af0000", "commodityName":"百事可樂", "commodityDetails":"商品詳情", "specification":"箱", "specificationCount":"24", "smallestUnit":"瓶", "singlePrice":"300", "groupPrice1":"280", "groupPrice2":"250", "sellerArea":"北京市", "versiont":0, "sellerEntity":{ "id":"37" } }
version是JPA的樂觀鎖實現,在修改的時候會檢查version,沒有傳遞的時候後臺接受為null值,與資料庫中的version欄位不符合,被視為新資料,所以生成了insert語句。