Spring Boot启动自动恢复MySQL已删旧列及插入报错问题求助
问题排查:Spring Boot启动重建已删数据库列 + 新增接口字段无默认值错误
一、旧列exam_name/exam_cost自动重建的原因及解决
可能原因
- 实体类未同步更新:JPA实体类中仍保留了
exam_name、exam_cost对应的字段(含getter/setter),Hibernate会根据实体类结构自动同步数据库表,导致删除的列被重建。 - 字段映射注解错误:新增的
examName/examCost字段若使用了@Column(name = "exam_name")这类注解,Hibernate会认为需要创建/保留exam_name列,而非目标新列examName。 - 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模式下会触发此错误。
解决步骤
- 检查实体类配置:
- 若
questionNumber允许为空:在实体类字段上添加@Column(nullable = true),同时确保数据库表中该列设置为NULL允许。 - 若
questionNumber不允许为空:要么在实体类中设置默认值(比如private Integer questionNumber = 1;),要么通过@Column(columnDefinition = "INT DEFAULT 1")指定数据库层默认值。
- 若
- 修改数据库表结构:直接执行SQL语句补充默认值或允许为空:
-- 设置默认值(根据字段类型调整) ALTER TABLE your_table MODIFY COLUMN questionNumber INT DEFAULT 0; -- 允许字段为空 ALTER TABLE your_table MODIFY COLUMN questionNumber INT NULL; - 检查接口请求逻辑:确认前端请求是否传入了
questionNumber参数,若前端无法提供,可在后端DTO或Service层为该字段设置默认值(比如在DTO初始化时赋值)。
内容的提问来源于stack exchange,提问作者Joseph McTigue
相关产品推荐
相关产品推荐

