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的版本到兼容的:
- 先排除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> - 手动加回兼容版本的依赖:
<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> - 最后检查下测试配置里的H2初始化脚本路径、表名大小写设置——不同版本的H2对大小写的处理可能不一样,容易踩坑。
总结一下
优先选方案一修正映射问题,毕竟Hibernate的校验变更是为了避免潜在的映射错误,长期来看对项目维护更友好。方案二只能临时救急,后续还是建议慢慢迁移到符合新版本规范的写法。
内容的提问来源于stack exchange,提问作者Jatin Kheradiya
相关产品推荐
相关产品推荐

