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

Spring Boot从2.1.1升级至2.6.6时出现Hibernate-core相关测试失败问题

解决Spring Boot 2.6.6升级后Hibernate @MapsId映射异常及回退版本的问题

我来帮你搞定这个升级后遇到的Hibernate问题,刚好对这两个版本的差异比较熟悉,咱们一步步来分析解决:

问题根源拆解

你碰到的org.hibernate.AnnotationException: Unable to find column reference in the @MapsId mapping: ad_server,确实是Hibernate从5.3.x升级到5.6.x时的一个校验逻辑强化导致的——官方在相关变更里严格了@MapsId映射的列引用检查,原来5.3.x里能蒙混过关的不规范写法,到5.6.x直接就被拦截报错了。

而退回到Hibernate 5.3.7后出现的H2表找不到问题,是因为Spring Boot 2.6.6默认带的H2版本和旧版Hibernate不兼容,导致表初始化的时候出了问题。

方案一:修正@MapsId映射(首推!)

既然Hibernate的变更是规范化的要求,最稳妥的方式就是修正实体类里的@MapsId写法,确保映射的列引用完全正确:

  • 先检查用了@MapsId的实体类,确认@MapsId指定的名称和关联实体的主键列名/属性名完全匹配
  • 如果是复合主键的场景,要保证@MapsId里的每个属性都能对应到关联实体的主键属性或者数据库列
  • 给你举个修正前后的例子:
    // 之前可能的错误写法(列名或属性名不匹配)
    @Entity
    public class ChildEntity {
        @Id
        private Long id;
        @MapsId("ad_server")
        @ManyToOne
        @JoinColumn(name = "ad_server_id")
        private ParentEntity parent;
    }
    
    // 修正后的写法(确保@MapsId和ParentEntity的主键属性一致,这里假设Parent主键是id)
    @Entity
    public class ChildEntity {
        @Id
        private Long id;
        @MapsId("id") // 或者直接用@MapsId,默认关联主键属性
        @ManyToOne
        @JoinColumn(name = "ad_server_id")
        private ParentEntity parent;
    }
    

方案二:强制回退Hibernate版本(临时应急用)

如果暂时没法改实体代码,非要用Hibernate 5.3.7搭配Spring Boot 2.6.6,那得同步调整H2的版本到兼容的:

  1. 先排除Spring Boot默认带的Hibernate和H2依赖(以Maven为例,Gradle类似):
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  2. 手动加回兼容版本的依赖:
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.3.7.Final</version>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.199</version> <!-- 这个版本和Hibernate 5.3.x完美兼容 -->
        <scope>test</scope>
    </dependency>
    
  3. 最后检查下测试配置里的H2初始化脚本路径、表名大小写设置——不同版本的H2对大小写的处理可能不一样,容易踩坑。

总结一下

优先选方案一修正映射问题,毕竟Hibernate的校验变更是为了避免潜在的映射错误,长期来看对项目维护更友好。方案二只能临时救急,后续还是建议慢慢迁移到符合新版本规范的写法。

内容的提问来源于stack exchange,提问作者Jatin Kheradiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:17:36