ddl-auto设为validate时Hibernate跨SQL Server库找不到序列
Spring Boot+Hibernate多库环境下,ddl-auto=validate时无法识别跨库序列
环境
- Spring Boot版本:3.2.1(搭配Hibernate-Core 6.4.1.Final),也测试过3.3.1(搭配Hibernate-Core 6.5.2.Final)
- 数据库:包含多个可访问数据库的MS SQL Server
问题
实体映射到数据库A的视图,其@Id字段依赖的序列位于数据库B,已通过@SequenceGenerator明确指定catalog和schema指向该序列。但当spring.jpa.hibernate.ddl-auto设为validate时,Hibernate启动抛出序列找不到的错误——它仅查询默认连接库A的INFORMATION_SCHEMA.SEQUENCES,完全没有检查映射中指定的catalog。将ddl-auto设为none则启动正常,且运行时序列能被正确调用。
错误信息
Schema-validation: missing sequence ["B.schema_from_B.my_sequence"]
代码示例
实体类:
@Getter @Setter @Entity @Table(name = "my_view", schema = "schema_from_A", catalog = "A") public class ViewEntity { @Id @GeneratedValue(strategy = SEQUENCE, generator = "my_seq_generator") @SequenceGenerator(name = "my_seq_generator", catalog = "B", schema = "schema_from_B", sequenceName = "my_sequence") @Column(name = "id") private Integer id; }
配置文件(application.yml):
spring: datasource: url: jdbc:sqlserver://<ip_of_server>;databaseName=A;encrypt=true;trustServerCertificate=true jpa: properties: hibernate: default_catalog: A default_schema: my_schema_A hibernate: ddl-auto: validate
临时解决方案
- 临时将
ddl-auto设为none,跳过Hibernate的schema校验流程,应用可正常启动且序列能正常工作。 - 若需保留schema校验,可手动添加跨库序列的校验逻辑(比如启动时通过JdbcTemplate执行查询检查序列是否存在)。
问题根源
这是Hibernate在schema校验阶段的缺陷:校验序列存在性时,未正确应用@SequenceGenerator中指定的catalog属性,而是直接使用默认catalog查询系统视图,导致跨库序列无法被识别。但运行时生成SQL时,Hibernate能正确拼接catalog和schema,因此序列可正常使用。
内容的提问来源于stack exchange,提问作者Apodeus
相关产品推荐
相关产品推荐

