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

Spring中Delete API问题:删除Categoria时未同步删除关联List数据

问题排查与解决方案

1. 优先修正字段名匹配问题

你需求里明确说明list表中是category字段匹配categoria的ID,但你的原生SQL里写的是l.categoria = :id,这大概率是字段名写错了。先确认list表的关联字段到底是categoria还是category,修正SQL中的字段名:

@Modifying
@Query(value = "DELETE FROM list l WHERE l.category = :id AND l.whitelist = 1", nativeQuery = true)
void deleteListsByCategoriaIdAndWhitelist(@Param("id") Long id);

2. 调整事务注解的配置

你在三个方法上都加了@Transactional,Spring的代理机制下,内部调用带@Transactional的方法不会触发新的事务代理,可能导致第一个删除操作的事务未正确提交。建议只在默认方法deleteCategoriaAndLists上保留@Transactional,去掉另外两个方法的注解:

@Modifying
@Query(value = "DELETE FROM list l WHERE l.category = :id AND l.whitelist = 1", nativeQuery = true)
void deleteListsByCategoriaIdAndWhitelist(@Param("id") Long id);

@Modifying
@Query(value = "DELETE FROM categoria c WHERE c.id = :id", nativeQuery = true)
void deleteCategoriaById(@Param("id") Long id);

@Transactional
@Modifying
default void deleteCategoriaAndLists(Long categoriaId) {
    deleteListsByCategoriaIdAndWhitelist(categoriaId);
    deleteCategoriaById(categoriaId);
}

3. 验证SQL语句的有效性

直接在数据库客户端执行对应的删除SQL,传入测试ID,确认是否能删除list表的目标数据:

DELETE FROM list WHERE category = {测试ID} AND whitelist = 1;

如果这条SQL执行后没有数据被删除,说明要么是ID不存在匹配的数据,要么是字段名、条件逻辑有误。

4. 添加日志排查执行细节

在deleteCategoriaAndLists方法里添加日志打印传入的ID,同时在Spring Boot配置中开启SQL日志(logging.level.org.hibernate.SQL=DEBUG),确认两条SQL是否都被执行,以及参数是否正确传入。

内容的提问来源于stack exchange,提问作者Marco Rossi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:08:21