当前位置:   article > 正文

项目记录:使用SpringBoot + MyBatisPlus 在MySQL字段设置外键后ID自增失效导致添加失败问题(ID生成策略)_yml配置自增id

yml配置自增id

目录

说明

外键列设置后自增失效特性演示

ID不设置自增策略,报错问题和解决

设置自增策略冲突问题和解决。


说明

记录在使用SpringBoot + MyBatisPlus操作数据库以及和前端页面交互时遇到的问题和解决方式。

1.表主键字段设置外键之后,自增功能失效问题。

2.PostMan测试传入json数据后台接收时报错argument type mismatch解决。

3.yml文件配置ID自增策略为auto后导致表外键自增列添加失败问题解决。

外键列设置后自增失效特性演示

现有表 tab_student_info 和表 tab_login_info,两个表的字段

tab_student_info-学生信息表

  tab_login_info-登录信息表

登录信息表的ID设置外键映射学生信息表的ID。

给登录信息表添加记录,ID字段设置为null,查看ID是否会自增。

INSERT INTO tab_login_info VALUES(NULL,'123456')

执行该SQL语句,会报如下错误:

1452 - Cannot add or update a child row: a foreign key constraint fails (`xingshang`.`tab_login_info`, CONSTRAINT `fk_logininfo_stuinfo_id` FOREIGN KEY (`id`) REFERENCES `tab_student_info` (`id`))

大概意思就是:该条记录无法添加或更新,因为存在外键约束

因此就只能在添加记录时,显示的声明ID了,如下:

INSERT INTO tab_login_info VALUES(7,'123456')

 添加成功: Affected rows: 1

ID不设置自增策略,报错问题和解决

用SpringBoot+MyBatisPlus 在写好表现层接口后,使用PostMan测试接口的新增记录方法:save()

获取PostMan传入的对应实体类的json数据,报错:argument type mismatch解决。

表现层接口代码:

  1. @RestController //加入Bean 使用REST风格 响应数据
  2. @RequestMapping("/students")
  3. public class StudentInfoController {
  4. @Autowired
  5. private StudentInfoService stuService;
  6. @PostMapping(produces = "application/json;charset=UTF-8")
  7. public Result AddStudentInfo(@RequestBody StudentInfo studentInfo){ //自动将前端json数据转为我们自定的实体类对象
  8. boolean save = stuService.save(studentInfo);
  9. Result r = new Result(true,"添加成功"); //前后端数据联调(自定义Result类)
  10. return r;
  11. }
  12. }

PostMan测试

 PostMan发送请求之后,报错:argument type mismatch (ERROR 23828)

翻译来说是:参数类型不匹配,指向是(StudentInfoController.java:25),一看是save()报错,

开始以为是save()参数有问题,检查save()的参数要求为StudentInfo对象,打印来看(@RequestBody StudentInfo studentInfo)中接收的参数也是会自己转为StudentInfo对象。

并不是这个问题,思考是否是StudentInfo类中字段类型问题。

解决:yml配置文件设置ID自增策略后解决报错。

设置自增策略后添加成功。 

 

说明:

虽然这个表现层添加了,但是我们测试一下login表对应的表现层,结果是会报错的。

因为login表的ID存在外键约束,此博客的最上方已经说明了外键约束后ID自增会失效的问题,设置了外键约束的ID主键列只能显示的输入ID进行记录的添加。

PostMan页面:

 发送请求报错:

 不管ID是null还是指定ID,都会报错:

java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails......

报错解决方案如下  

设置自增策略冲突问题和解决。

上方报错,报错信息是外键约束导致报错,因为我们想设置ID自增,在yml文件中设置了

id-type: auto,配置文件范围是全局的。导致我们设置了外键的login表ID字段添加记录时报错,所以思路就是全局ID还是使用自增策略,设置了外键的字段设置为用户自定义输入策略即可。

实际解决方式

在外键属性添加注解:@TableId(type = IdType.INPUT),单独设置字段的输入策略。

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class LoginInfo {
  5. /**
  6. * 学生学号
  7. */
  8. @TableId(type = IdType.INPUT)
  9. private Integer id;
  10. /**
  11. * 登录密码
  12. */
  13. @TableField(select = false)
  14. private String password;
  15. }

设置后,未设置外键的字段ID可以使用表自增的策略,而设置有外键的ID字段,也可以实现ID的显示赋值,报错解决。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/1009387
推荐阅读
相关标签
  

闽ICP备14008679号