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

