Hibernate查询序列缺少start_with列 无法加载ApplicationContext
问题根因
你的Hibernate配置中方言配置错误:当前配置的是org.hibernate.dialect.HSQLDialect(HSQL内存数据库的方言),但实际使用的是PostgreSQL数据库。
Hibernate会根据配置的方言选择对应数据库的元数据提取逻辑,HSQLDialect对应的序列元数据提取器就是报错中的SequenceInformationExtractorHSQLDBDatabaseImpl,这个提取器默认从查询结果中取start_with列作为序列起始值,而PostgreSQL的information_schema.sequences表中序列起始值的列名为start_value,因此会抛出列不存在的异常。
疑问解答
- 为什么会调用
SequenceInformationExtractorHSQLDBDatabaseImpl#sequenceStartValueColumn?
因为方言配置为HSQLDialect,Hibernate默认使用HSQL数据库对应的元数据提取实现。Docker测试环境未触发是因为对应测试配置中方言配置正确,或者未开启hibernate.hbm2ddl.auto=validate逻辑,不会走到序列元数据校验的步骤。 - 为什么会查询不存在的列?
start_with是HSQL数据库的序列起始值列名,与PostgreSQL的实际列名不匹配,本质是方言不匹配导致的列名错误。 - 配置存在错误,错误点就是
hibernate.dialect配置项值与实际使用的数据库不匹配。
解决方案
修改Hibernate配置中的方言为PostgreSQL对应版本的方言即可,你使用的是PostgreSQL 11,修改如下:
// 替换hibernateProperties中原来的HSQLDialect配置行 hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQL11Dialect");
如果后续升级PostgreSQL版本,只需要将方言调整为对应版本即可,比如PostgreSQL 13对应PostgreSQL13Dialect。修改后重启应用即可解决该异常。
内容的提问来源于stack exchange,提问作者iluvfugu
相关产品推荐
相关产品推荐

