美文网首页
开发过程中遇到的堆栈问题

开发过程中遇到的堆栈问题

作者: zhy0324 | 来源:发表于2019-11-30 17:04 被阅读0次

    今天在开发的的时候遇到了一个灵异事件,我在做停车子系统的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,问题解决。

    相关文章

      网友评论

          本文标题:开发过程中遇到的堆栈问题

          本文链接:https://www.haomeiwen.com/subject/cugowctx.html