扶苏a 2025-05-06 18:28 采纳率: 0%
浏览 15

关于苍穹外卖的问题,请各位专家解答!

在写苍穹外卖的修改套餐模块时发现回显仍然显示套餐菜品 明明已经调用了deleteById方法 然后我又去看之前的菜品管理 发现菜品管理的口味也回显了 我记得我写完然后调试的时候明明没有回显口味 但是更新可以正常更新 没有其他报错 求解答
SetmealController

  @GetMapping("/{id}")
    @ApiOperation("根据id查询套餐")
    public Result<SetmealVO> select(@PathVariable Long id){
        log.info("当前查询套餐id为:{}",id);
        SetmealVO setmealVO = setmealService.selectById(id);
        return Result.success(setmealVO);
    }

    /**
     * 修改套餐
     *
     * @param setmealDTO
     * @return
     */
    @PutMapping
    @ApiOperation("修改套餐")
    public Result update(@RequestBody SetmealDTO setmealDTO) {
        setmealService.update(setmealDTO);
        return Result.success();
    }

SetmealService

    /**
     * 根据id查询套餐
     * @param id
     * @return
     */
    SetmealVO selectById(Long id);

    /**
     * 修改套餐
     * @param setmealDTO
     */
    void update(SetmealDTO setmealDTO);

SetmealServiceImpl


  /**
     * 根据id查询套餐
     * @param id
     * @return
     */
    @Override
    public SetmealVO selectById(Long id) {

        Setmeal setmeal = setmealMapper.getById(id);
        List<SetmealDish> setmealDishes =  setMealDishMapper.getBySetMealDishId(id);
        SetmealVO setmealVO = new SetmealVO();
        BeanUtils.copyProperties(setmeal,setmealVO);
        setmealVO.setSetmealDishes(setmealDishes);
        return setmealVO;
    }


    /**
     * 修改套餐
     * @param setmealDTO
     */

    @Transactional
    public void update(SetmealDTO setmealDTO) {
        Setmeal setmeal = new Setmeal();
        BeanUtils.copyProperties(setmealDTO, setmeal);

        //1、修改套餐表,执行update
        setmealMapper.update(setmeal);

        //套餐id
        Long setmealId = setmealDTO.getId();

        //2、删除套餐和菜品的关联关系,操作setmeal_dish表,执行delete
        setMealDishMapper.deleteById(setmealId);

        List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
        setmealDishes.forEach(setmealDish -> {
            setmealDish.setSetmealId(setmealId);
        });
        //3、重新插入套餐和菜品的关联关系,操作setmeal_dish表,执行insert
        setMealDishMapper.insertBatch(setmealDishes);
    }
}

SetmealMapper


    @AutoFill(OperationType.UPDATE)
    void update(Setmeal setmeal);


SetmealDishMapper

    @Select("select * from setmeal_dish where setmeal_id = #{setmealId};")
    List<SetmealDish> getBySetMealDishId(Long id);

    @Delete(("delete from setmeal_dish where setmeal_id = #{setmealId};"))
    void deleteById(Long setmealId);


SetmealMapper.xml

  <update id="update">
        update setmeal
        <set>
            <if test="name != null">
                name = #{name},
            </if>
            <if test="categoryId != null">
                category_id = #{categoryId},
            </if>
            <if test="price != null">
                price = #{price},
            </if>
            <if test="image != null">
                image = #{image},
            </if>
            <if test="description != null">
                description = #{description},
            </if>
            <if test="status != null">
                status = #{status},
            </if>
            <if test="updateTime != null">
                update_time = #{updateTime},
            </if>
            <if test="updateUser != null">
                update_user = #{updateUser},
            </if>
        </set>
        where id = #{id}
    </update>


  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-05-06 18:29
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析
      - 在修改套餐模块中,调用deleteById方法后套餐菜品仍回显。
      - 菜品管理模块中口味出现了异常回显情况,之前调试时没有该问题。
    2. 解决方案
      - 检查数据删除逻辑
      • 确认deleteById方法是否真正正确地删除了与套餐相关的菜品数据。可以在数据库中查看相关记录是否确实被删除。例如,如果使用的是MyBatis框架,在对应的Mapper XML文件中,deleteById方法的SQL语句是否正确,参数传递是否无误。
        xml <delete id="deleteById" parameterType="long"> DELETE FROM套餐菜品表 WHERE id = #{id} </delete>
      • 检查数据查询逻辑
      • 对于套餐菜品回显,查看获取回显数据的查询方法。可能是查询语句没有正确更新,仍然查询到了已删除的菜品。比如在Service层的查询方法中,SQL语句是否正确关联了相关表。
        java public List<套餐菜品对象> get套餐菜品List() { return套餐菜品Mapper.selectList(null); }
      • 对于菜品管理模块的口味回显,检查口味数据的查询和赋值逻辑。看是否有其他地方意外地重新设置了口味回显数据,或者查询条件有误导致错误的数据被查询出来并回显。
      • 清理缓存(如果有缓存机制)
      • 如果系统中存在缓存,调用deleteById方法后,缓存中的数据可能没有及时更新。需要检查缓存的清除逻辑,确保在数据删除后,相关缓存也被正确清除。例如使用Spring Cache时,配置正确的缓存清除策略。
        java @CacheEvict(value = "套餐菜品缓存", key = "#id") public void deleteById(Long id) { // 实际删除数据库记录的代码 }
    3. 多种解决方案的优缺点
      - 优点
      • 检查数据删除逻辑
      • 直接针对问题根源,从数据删除操作入手,能快速定位是否数据没有被真正删除。
      • 可以详细检查SQL语句和参数传递,确保数据删除的准确性。
      • 检查数据查询逻辑
      • 全面排查获取回显数据的过程,能发现查询语句和数据关联是否存在问题。
      • 有助于发现可能隐藏在查询逻辑中的错误,比如错误的表连接或查询条件。
      • 清理缓存(如果有缓存机制)
      • 对于存在缓存的系统,能有效解决缓存数据不一致导致的回显问题。
      • 可以保证数据的实时性,让系统显示最新的数据。
      • 缺点
      • 检查数据删除逻辑
      • 比较依赖数据库操作的熟悉程度,如果SQL语句复杂,排查起来可能需要花费较多时间。
      • 只关注了数据删除,没有全面考虑其他可能影响回显的因素。
      • 检查数据查询逻辑
      • 涉及到多个查询方法和相关业务逻辑,排查范围较广,可能需要较多的调试时间。
      • 对于复杂的业务逻辑,可能难以快速定位到具体出错的查询点。
      • 清理缓存(如果有缓存机制)
      • 增加了系统的复杂性,需要额外处理缓存相关的逻辑。
      • 如果缓存策略设置不当,可能会影响系统性能。
    4. 总结
      - 综合来看,先检查数据删除逻辑是比较直接有效的方法,能快速确认数据是否真的被删除。接着检查数据查询逻辑,确保获取回显数据的过程正确。最后,如果系统有缓存,清理缓存也是解决回显问题的关键步骤。通过这几个方面的排查和处理,有望解决套餐菜品和口味回显异常的问题。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月6日