昨天遇到一个问题,使用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语句。
网友评论