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
相关产品推荐
相关产品推荐

