JPA插入数据报Invalid column name 'SaleStatus_id'错误如何解决?
问题解决方法
根因说明
报错是Hibernate自动生成的外键列名和数据库实际存在的列名不匹配导致的,具体原因有两点:
MakeSale实体类中关联SaleStatus的属性名用了大驼峰格式SaleStatus,不符合Java小驼峰命名规范,Hibernate默认按照【关联属性名_关联表主键名】的规则生成外键名,拼接后就得到了SaleStatus_id,和你数据库里的sale_status_id无法匹配。- 未显式指定关联字段的映射规则,依赖自动生成的规则容易受命名策略、属性命名的影响出现匹配错误。
具体解决步骤
方案1(最稳妥,不受全局命名策略影响)
直接在@OneToOne注解上添加@JoinColumn显式指定外键列名,同时修正关联属性为标准小驼峰命名,修改后的MakeSale类关联部分代码如下:
@OneToOne @JoinColumn(name = "sale_status_id", referencedColumnName = "id") private SaleStatus saleStatus;
name参数填数据库中实际存在的外键列名sale_status_idreferencedColumnName参数填关联的SaleStatus表的主键列名,这里对应id,可省略不写,默认就是关联主键列。
方案2(配合全局命名策略使用)
如果你已经配置了全局驼峰转下划线的命名策略(Spring Boot项目默认的org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy就支持该规则),只需要把关联属性名修正为小驼峰saleStatus即可,Hibernate会自动把saleStatus转为下划线格式sale_status,拼接主键id后得到正确的外键名sale_status_id:
@OneToOne private SaleStatus saleStatus;
如果需要确认全局命名策略是否配置正确,可以查看项目配置文件中JPA相关配置,Spring Boot项目的yaml配置示例如下:
spring: jpa: hibernate: naming: physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
修改完成后重新启动项目即可正常插入数据。
内容的提问来源于stack exchange,提问作者lewis machilika
相关产品推荐
相关产品推荐

