今天在开发的的时候遇到了一个灵异事件,我在做停车子系统的vip车辆下发,代码如下
@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都是同一个,很疑惑的是,明明我已经把每一个model都setId了,怎么id还是同一个。返回去查数据库,明明是新增了很多条,id也不一样。怎么会出现这种问题
猛然发现,issuedList中存放的是model的栈地址,并不是model的数据对象,model是在循环外面就有的,所以第一次第二次存放进issuedList的都是同一个地址,最终的list里的每一个model的值都会是最后一次修改时的值。
这里的误区是因为持久化新增数据库,觉得数据库的数据不一样,每个model的数据也会不一样,其实持久化的时候,就将数据持久化到了硬盘上。
然后就修改了代码
@Override
@Transactional
public boolean insert(FixedCarDto model) {
List<FixedCarDto> issuedList = new ArrayList<>();
carParkSpaceDtos.forEach(carParkSpaceDto -> {
...
fixedCarService.insert(model);
//创建新对象接收老对象,否则两次添加的model都是同一个model栈地址,第二次model的值改变会改变list里所有的model的值
FixedCarDto issuedModel = BeanUtils.convert(model,FixedCarDto.class);
issuedList.add(issuedModel);
//下发子系统
});
subsystemIssuedFixedCarManager.issuedVipOrFixedCar(issuedList);
return true;
}
通过一个新对象去接收model,然后放入list,问题解决。