You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot JPA调用删除方法返回204但数据库记录未被删除

Spring Boot JPA调用删除方法返回204但数据库记录未被删除

嘿,这个问题确实挺挠头的——控制器返回204说明请求走通了,但数据库里的记录纹丝不动,肯定是代码里漏了关键步骤。我先盯着你贴的这段FlashcardSet Service代码看了看,发现几个值得注意的点:

  • 缺少实际的删除执行语句
    你现在的方法里,只做了三件事:清空持久化上下文(entityManager.clear())、根据ID查询FlashcardSet、查不到就抛异常。但从头到尾都没调用实际的删除方法啊!比如你应该在查到flashcardSet之后,加上一行关键代码:

    flashcardSetRepository.delete(flashcardSet);
    // 或者用EntityManager的方式:
    // entityManager.remove(flashcardSet);
    

    没有这一步,JPA根本不知道你要删除这条记录,自然不会把删除操作同步到数据库。

  • 开头的entityManager.clear()可能画蛇添足
    你在方法最开始就清空了持久化上下文,虽然这不一定会直接导致删除失败,但其实完全没必要——在查询之前清空上下文,只会移除原本缓存的实体,对你这个删除方法来说是多余操作,反而可能引入不必要的问题,建议先把这行去掉试试。

  • userId参数未被使用的潜在隐患
    你的方法参数里传了userId,但代码里根本没用到它。是不是你原本打算校验这个FlashcardSet属于当前用户?比如应该加个权限判断:

    if (!flashcardSet.getUserId().equals(userId)) {
        throw new AccessDeniedException("无权限删除该卡片集");
    }
    

    虽然这不是当前删除失败的直接原因,但如果没做这个校验,万一请求传了不属于当前用户的flashcardSetId,后续可能会出现权限问题,还是补上比较稳妥。

另外再确认下你的@Transactional注解是否生效:比如这个Service类有没有被Spring容器管理(比如加了@Service注解),如果注解没生效的话,事务不会提交,但你返回204说明方法没抛异常,大概率是注解没问题,但还是要确认下。

总的来说,最核心的问题就是没执行实际的删除操作,补上对应的删除代码后,数据库里的记录应该就能正常被删除了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:25:30