bug场景演示:
(商品进货)采购单表:
(商品进货)采购单商品表:
下面搜索商品采购信息:
点击搜索请求的后台执行方法:
/**
* 根据条件获取商品采购信息
* @param purchaseList
* @param purchaseListGoods
* @return
* @throws Exception
*/
@RequestMapping("/listCount")
@RequiresPermissions(value="商品采购统计")
public Map<String,Object> listCount(PurchaseList purchaseList,PurchaseListGoods purchaseListGoods)throws Exception{
Map<String,Object> resultMap=new HashMap<>();
//第一次过滤:根据进货单(purchaseList)里面的条件 查询
List<PurchaseList> purchaseListList=purchaseListService.list(purchaseList, Direction.DESC, "purchaseDate");
//继续过滤
for(PurchaseList pl:purchaseListList){ //遍历得到每个进货单
purchaseListGoods.setPurchaseList(pl); //绑定订单
//第二次过滤:根据进货单商品(purchaseListGoods)里面的条件 查询
List<PurchaseListGoods> plgList=purchaseListGoodsService.list(purchaseListGoods);
//PurchaseList实体里面有PurchaseListGoods类型的属性 PurchaseListGoods实体里面也有PurchaseList类型的属性 这样遍历会出现死循环
for(PurchaseListGoods plg:plgList){
plg.setPurchaseList(null); //防止出现死循环
}
pl.setPurchaseListGoodsList(plgList);
}
resultMap.put("rows", purchaseListList);
logService.save(new Log(Log.SEARCH_ACTION,"商品采购统计查询"));
return resultMap;
}
执行此搜索方法后,发现数据库的数据发生了异常的变动:
为啥purchase_list_id这一列被update成了null呢?
1.bug出现原因:
上图箭头指向的这句:
plg.setPurchaseList(null);
这里只是设置属性为空,并没有保存,但mybatis却对plg(PurchaseListGoods类型)实体执行了update操作,如下图:
2.解决办法:
首先把里面那个for循环去掉:
然后在PurchaseListGoods实体里面purchaseList属性加上 @JsonIgnore注解:
再次启动,然后点击搜索,控制台不再有update的操作了: