在做java spring boot课设的时候,因为涉及到多张表,所以难以避免会有外键约束。而且通常发生在使用delete方法时候出现。报以下的错误
其实解决方法很简单,只需要重写你的delete方法即可
controller
(这里我在最上方加上了@RequestMapping("/admin/category/"))
@RequestMapping("delete")
public String delete(Integer id) {
categoryService.ifdelete(id);
// categoryService.delete(id);//原先的delete方法会导致外键约束的方法
return "redirect:/admin/category/list";
}
servicelmpl
(service这里就不给出代码了,只是些方法的定义)
@Override
public int delete(Integer id) {
return categoryDao.deleteById(id);
}//这里是一开始的delete
@Override
public Category ifdelete(Integer id) {
return categoryDao.ifdelete(id);
}
}
Dao
(这里实现对数据库的查询sql,可以看到,原先的delete(这里用的是接口BaseMappe里面的delete方法)并没有考虑到外键约束,所以我自己写了一个ifdelete方法,当要删除的时候这,个SQL语句的目的是从tab_category
表中删除那些在tab_route
表中没有的记录,这样就完美解决了外键约束的方法)
@Mapper
public interface CategoryDao extends BaseMapper<Category> {
@Select("SELECT cname,cid FROM tab_category WHERE cid=#{id}")
public Category findById(Integer id);
@Select("DELETE FROM tab_category WHERE cid NOT IN (SELECT cid FROM tab_route);")
public Category ifdelete(Integer cid);
}
还有实现类
@Data
@TableName("tab_category")
public class Category implements Serializable {
@TableId(type = IdType.AUTO)
private Integer cid;//分类id
private String cname;//分类名称
}
@Data
@TableName("tab_route")
public class Route implements Serializable {
@TableId(type = IdType.AUTO)
private Integer rid;//线路id,必输
private String rname;//线路名称,必输
private Double price;//价格,必输
private String routeIntroduce;//线路介绍
private String rflag; //是否上架,必输,0代表没有上架,1代表是上架
private String rdate; //上架时间
private String isThemeTour;//是否主题旅游,必输,0代表不是,1代表是
private Integer count;//收藏数量
private Integer cid;//所属分类,必输
private String rimage;//缩略图
private Integer sid;//所属商家
private String sourceId;//抓取数据的来源id
@TableField(exist = false)
private Category category;//所属分类 使用resultmap的assocation处理
@TableField(exist = false)
private Seller seller;//所属商家 使用resultmap的assocation处理
@TableField(exist = false)
private List<RouteImg> routeImgList;//商品详情图片列表,关联属性,mybatis plus不能查,需要配置resultmap使用resultmap的collection处理
}
上述方法对jpa和mybatis以及mybatis plus均适用
不过值得一提的是,这个在实现删除的操作的时候,是没有任何提示的,当然可以自己写一个重定向的前端页面。我一开始考虑的是用ajax来进行数据的传输,这样也可以在上方给出一些提示,但是过程有些小复杂,而且我对ajax也不熟悉,于是乎放弃。