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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:15:17