升级Spring Boot后测试报错Table REVINFO not found如何解决
问题根因
核心诱因有两个,按影响优先级排序:
- Hibernate 组件版本严重不兼容:当前环境中
hibernate-core版本为5.6.9,hibernate-envers却停留在5.3.20.Final,两个组件跨了3个次版本号,Envers内置的REVINFO表自动生成逻辑、审计表外键映射规则和高版本Core完全不匹配,根本不会正常触发REVINFO表的创建流程,生成的外键关联语句也会和实际表结构规则冲突。Spring Boot 2.7.0的依赖管理默认已经把Envers版本对齐到和Core一致的5.6.9.Final,这个版本不一致的问题基本是手动锁死Envers旧版本导致的。 - Spring Boot 2.7版本调整了SQL初始化脚本的执行顺序:2.3.x版本中
schema.sql默认在Hibernate初始化(含Envers建表逻辑)之前执行,2.7版本默认执行顺序变更后,如果手动在schema.sql里建表,很容易出现Hibernate生成外键关联时表还没创建的时序问题;再叠加使用的H2 2.x版本对标识符大小写校验更严格,手动建表时如果表名大小写和Envers默认引用的名称不一致,也会抛出表不存在的错误。
解决步骤
按顺序操作即可:
- 首先对齐Hibernate组件版本。删除构建文件(pom.xml/gradle.build)中手动给
hibernate-envers指定的版本号,完全交给Spring Boot的依赖管理机制对齐版本,保证hibernate-core和hibernate-envers版本完全一致。
Maven依赖写法参考(不要加version标签):
版本对齐后,只要没有手动关闭Hibernate的ddl自动执行,Envers会自动创建REVINFO表和所有审计表的关联约束,绝大多数场景下这一步就能解决问题。<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-envers</artifactId> </dependency> - 如果业务要求完全用自定义SQL脚本管理表结构,不使用Hibernate自动建表,就调整配置修正脚本执行时序,同时关闭Hibernate自动ddl避免冲突:
写REVINFO建表语句时注意适配H2 2.x的大小写规则,标准表结构参考如下,避免名称匹配失败:spring: jpa: hibernate: ddl-auto: none defer-datasource-initialization: false sql: init: mode: alwaysCREATE TABLE IF NOT EXISTS REVINFO ( REV INT NOT NULL AUTO_INCREMENT, REVTSTMP BIGINT NOT NULL, PRIMARY KEY (REV) ); - 如果是执行测试套件时抛出的错误,检查测试配置是否单独指定了旧版Envers的拦截器或自动配置类,版本对齐后删除测试配置中冗余的Envers相关自定义配置即可,不需要额外加适配类。
内容的提问来源于stack exchange,提问作者covfefe
相关产品推荐
相关产品推荐

