Hibernate3.x升级至5.6版本使用HBM文件时Schema校验提示缺少表问题
解决方案
1 优先修复配置拼写错误
你的Hibernate配置中存在属性名拼写错误,导致命名策略未生效:
原错误配置:
<property name="hibernate.naming.implicit-strategyy">org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl</property>
属性名末尾多了一个字母y,修正为:
<property name="hibernate.naming.implicit-strategy">org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl</property>
2 处理表名大小写敏感问题
MariaDB在Linux环境下默认开启表名大小写敏感,而Windows/macOS环境默认不敏感,这也符合你本地运行正常、TeamCity(通常为Linux环境)报错的特征:
- 登录TeamCity对应的MariaDB实例,执行
show tables like '%commtemplateinfos%',确认实际表名的大小写和HBM配置中的commtemplateinfos完全一致 - 如果存在大小写差异,可统一修改为小写,或者修改MariaDB配置文件
my.cnf添加lower_case_table_names=1,重启数据库后生效
3 验证数据库用户权限
确认TeamCity环境使用的数据库账号拥有my_db库下commtemplateinfos表的SELECT权限,Hibernate做schema验证时需要读取系统表元数据,权限不足会导致识别不到表存在:
GRANT SELECT ON my_db.commtemplateinfos TO '你的业务账号'@'%'; FLUSH PRIVILEGES;
4 调整catalog配置
Hibernate 5.x对集合关联表的catalog处理逻辑和3.x存在差异,你配置了hibernate.default_catalog,可以尝试两种调整方案:
- 方案一:直接删除
hibernate.default_catalog配置项,因为你的JDBC URL中已经指定了默认库名,不需要额外配置catalog - 方案二:在HBM的集合映射中显式指定catalog属性:
<list name="commTemplateInfos" catalog="my_db" table="commtemplateinfos" cascade="all, delete-orphan" lazy="false">
临时绕开方案
如果需要先快速恢复业务,可临时将hbm2ddl.auto配置从validate改为none,关闭schema校验逻辑,等定位到根因后再改回校验即可。
内容的提问来源于stack exchange,提问作者tjholmes66
相关产品推荐
相关产品推荐

