You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

临时解决方案

  1. 临时将ddl-auto设为none,跳过Hibernate的schema校验流程,应用可正常启动且序列能正常工作。
  2. 若需保留schema校验,可手动添加跨库序列的校验逻辑(比如启动时通过JdbcTemplate执行查询检查序列是否存在)。

问题根源

这是Hibernate在schema校验阶段的缺陷:校验序列存在性时,未正确应用@SequenceGenerator中指定的catalog属性,而是直接使用默认catalog查询系统视图,导致跨库序列无法被识别。但运行时生成SQL时,Hibernate能正确拼接catalog和schema,因此序列可正常使用。

内容的提问来源于stack exchange,提问作者Apodeus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:40:58