Spring Boot 3.1.5迁移时Hibernate 6关联表注解报错排查
问题解析:Hibernate 6多对一关联使用关联表时的@JoinColumn报错问题
我正将Spring Boot 2.x组件迁移至3.1.5版本(当前最新版),使用Hibernate 6.2.9时遇到了Hibernate 5.x中不存在的错误。
核心代码
TickersAll实体的关联配置
@JsonIgnore @Fetch(FetchMode.SELECT) @ManyToOne(fetch = FetchType.EAGER) @JoinTable(name = "COMPANY_TICKERS", joinColumns = {@JoinColumn(name = "TICKER_SERIAL", referencedColumnName = "TICKER_SERIAL")}, inverseJoinColumns = {@JoinColumn(name = "COMPANY_ID", referencedColumnName = "COMPANY_ID")}) private CCPCompany ccpCompany;
关联的CCPCompany实体
@Entity @Table(name = "companies") public class CCPCompany { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_COMPANY_ID") @SequenceGenerator(sequenceName = "SEQ_COMPANY_ID", allocationSize = 1, name = "SEQ_COMPANY_ID") @Column(name = "COMPANY_ID", nullable = false) @Access(AccessType.PROPERTY) private Long companyId; // 其他字段 }
报错信息
启动应用时Hibernate抛出异常:
Caused by: org.hibernate.AnnotationException: The '@JoinColumn' for a secondary table must reference the primary key ... 76 common frames omitted
移除@JoinColumn中的referencedColumnName属性后应用可正常启动,但未在Hibernate 6迁移文档中找到相关说明,需要解析报错原因。
报错原因解析
Hibernate 6对@JoinTable内@JoinColumn的referencedColumnName校验逻辑做了严格收紧:
- Hibernate 5中,多对一通过关联表映射时,即便显式指定
referencedColumnName为实体主键(这里COMPANY_ID确实是CCPCompany的主键),框架不会强制校验映射的严谨性。 - 到了Hibernate 6,关联表被归为"secondary table"范畴,要求
@JoinColumn的referencedColumnName必须严格对应关联实体的主键属性。你的场景里触发报错的核心原因是CCPCompany的主键配置:- 主键字段
companyId使用了@Access(AccessType.PROPERTY),这意味着Hibernate会通过getter/setter方法访问主键,而非直接操作字段。 - 你在
inverseJoinColumns里指定referencedColumnName = "COMPANY_ID",这是数据库列名,但Hibernate 6此时会校验它是否匹配实体的属性名(这里属性名是companyId),列名和属性名不匹配就触发了异常。
- 主键字段
- 移除
referencedColumnName后,Hibernate会自动关联到实体的主键属性companyId,并自动映射到对应的数据库列COMPANY_ID,因此可以正常启动。
内容的提问来源于stack exchange,提问作者ahrooran
相关产品推荐
相关产品推荐

