今天在開發(fā)的的時候遇到了一個靈異事件,我在做停車子系統(tǒng)的vip車輛下發(fā),代碼如下
@Override
@Transactional
public boolean insert(FixedCarDto model) {
List<CarParkSpaceDto> carParkSpaceDtos = model.getCarParkSpaceDtos();
List<FixedCarDto> issuedList = new ArrayList<>();
carParkSpaceDtos.forEach(carParkSpaceDto -> {
...
fixedCarService.insert(model);
issuedList.add(model);
});
subsystemIssuedFixedCarManager.issuedVipOrFixedCar(issuedList);
return true;
}
然后我碰到了一個問題,就是我issuedList中的model的id都是同一個,很疑惑的是,明明我已經(jīng)把每一個model都setId了,怎么id還是同一個。返回去查數(shù)據(jù)庫,明明是新增了很多條,id也不一樣。怎么會出現(xiàn)這種問題
猛然發(fā)現(xiàn),issuedList中存放的是model的棧地址,并不是model的數(shù)據(jù)對象,model是在循環(huán)外面就有的,所以第一次第二次存放進issuedList的都是同一個地址,最終的list里的每一個model的值都會是最后一次修改時的值。
這里的誤區(qū)是因為持久化新增數(shù)據(jù)庫,覺得數(shù)據(jù)庫的數(shù)據(jù)不一樣,每個model的數(shù)據(jù)也會不一樣,其實持久化的時候,就將數(shù)據(jù)持久化到了硬盤上。
然后就修改了代碼
@Override
@Transactional
public boolean insert(FixedCarDto model) {
List<FixedCarDto> issuedList = new ArrayList<>();
carParkSpaceDtos.forEach(carParkSpaceDto -> {
...
fixedCarService.insert(model);
//創(chuàng)建新對象接收老對象,否則兩次添加的model都是同一個model棧地址,第二次model的值改變會改變list里所有的model的值
FixedCarDto issuedModel = BeanUtils.convert(model,FixedCarDto.class);
issuedList.add(issuedModel);
//下發(fā)子系統(tǒng)
});
subsystemIssuedFixedCarManager.issuedVipOrFixedCar(issuedList);
return true;
}
通過一個新對象去接收model,然后放入list,問題解決。