Spring Boot JPA级联保存时报Unknown column 'timesheet_id'错误如何解决
解决方法
- 方案1:直接指定外键列名(最直接,针对性解决单个字段问题)
在TimesheetDay实体类的@ManyToOne关联字段上添加@JoinColumn注解,显式指定关联的外键列名:
@ManyToOne @JoinColumn(name = "timesheetId") // 此处指定和数据库表完全一致的列名即可 private Timesheet timesheet;
该方案不需要修改全局配置,仅对当前关联字段生效,适合只有个别字段命名和Hibernate默认规则不符的场景。
- 方案2:修改全局Hibernate命名策略(适合项目所有表字段都用驼峰命名的场景)
如果项目中所有数据库表字段都采用驼峰命名,不需要Hibernate自动将驼峰转为下划线命名,可以在Spring Boot配置文件中修改命名策略配置:
如果使用application.properties:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
如果使用application.yml:
spring: jpa: hibernate: naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
修改后Hibernate会直接使用实体字段上@Column指定的名称或者字段原名作为数据库列名,不会自动添加下划线做转换。
附加注意事项
当前代码还有两个潜在问题可以同步修正:
Timesheet实体类的id属性类型为int,但数据库中定义的是BIGINT(20),建议将id类型改为Long,避免后续数据量超过int最大值时出现溢出问题。@Table注解的name属性值要和实际数据库表名完全匹配,当前数据库表名是Timesheet、TimesheetDays,如果配置了默认转小写的命名策略,也可能出现表名找不到的问题,可以显式指定@Table(name = "Timesheet")、@Table(name = "TimesheetDays")。
内容的提问来源于stack exchange,提问作者user1346346
相关产品推荐
相关产品推荐

