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

Spring Boot启动自动恢复MySQL已删旧列及插入报错问题求助

问题排查:Spring Boot启动重建已删数据库列 + 新增接口字段无默认值错误

一、旧列exam_name/exam_cost自动重建的原因及解决

可能原因

  1. 实体类未同步更新:JPA实体类中仍保留了exam_name、exam_cost对应的字段(含getter/setter),Hibernate会根据实体类结构自动同步数据库表,导致删除的列被重建。
  2. 字段映射注解错误:新增的examName/examCost字段若使用了@Column(name = "exam_name")这类注解,Hibernate会认为需要创建/保留exam_name列,而非目标新列examName。
  3. Hibernate DDL配置问题:spring.jpa.hibernate.ddl-auto配置为create或update时,Hibernate会主动修改数据库表结构。若实体类未更新,就会重建旧列。

解决步骤

  • 彻底清理实体类:删除所有与exam_name、exam_cost相关的字段、注解和方法,确保实体类仅包含examName、examCost新字段,并验证@Column注解的name属性与数据库新列名完全一致(比如@Column(name = "examName"))。
  • 调整DDL配置:开发阶段可保留update,但需确保实体类与数据库结构完全匹配;生产环境建议关闭自动DDL同步,将spring.jpa.hibernate.ddl-auto设为none或validate,改用Flyway/Liquibase等工具做手动数据库迁移。
  • 手动清理残留:若数据库中已被重建旧列,可手动执行ALTER TABLE your_table DROP COLUMN exam_name, DROP COLUMN exam_cost;删除,再重启应用验证。

二、新增接口报“Field 'questionNumber' doesn't have a default value”的解决

核心原因

数据库表的questionNumber字段未设置默认值,且插入数据时未传入该字段的值,MySQL在严格SQL模式下会触发此错误。

解决步骤

  1. 检查实体类配置:
    • 若questionNumber允许为空:在实体类字段上添加@Column(nullable = true),同时确保数据库表中该列设置为NULL允许。
    • 若questionNumber不允许为空:要么在实体类中设置默认值(比如private Integer questionNumber = 1;),要么通过@Column(columnDefinition = "INT DEFAULT 1")指定数据库层默认值。
  2. 修改数据库表结构:直接执行SQL语句补充默认值或允许为空:
    -- 设置默认值(根据字段类型调整)
    ALTER TABLE your_table MODIFY COLUMN questionNumber INT DEFAULT 0;
    -- 允许字段为空
    ALTER TABLE your_table MODIFY COLUMN questionNumber INT NULL;
    
  3. 检查接口请求逻辑:确认前端请求是否传入了questionNumber参数,若前端无法提供,可在后端DTO或Service层为该字段设置默认值(比如在DTO初始化时赋值)。

内容的提问来源于stack exchange,提问作者Joseph McTigue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:35:07