模式验证:使用 Hibernate 序列生成器策略时缺少表 [SEQUENCE_NAME]

Posted

技术标签:

【中文标题】模式验证:使用 Hibernate 序列生成器策略时缺少表 [SEQUENCE_NAME]【英文标题】:Schema-validation: missing table [SEQUENCE_NAME] when using Hibernate Sequence Generator Strategy 【发布时间】:2019-09-18 22:24:08 【问题描述】:

我在休眠 id 生成和 ms sql 服务器方面遇到了一些问题。

我在我的应用程序中使用GenerationType.SEQUENCE 来生成带有休眠的ID。

@Id
@SequenceGenerator(name = "SequenceGenerator", sequenceName = "SEQUENCE_NAME")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SequenceGenerator")
private Long id;

作为数据库,我使用 microsoft sql server 2017。

我通过 Liquibase 创建序列:

<createSequence incrementBy="50" sequenceName="SEQUENCE_NAME" startValue="100000"/>

启动 Spring Boot 应用程序时出现错误:

Schema-validation: missing table [SEQUENCE_NAME]

当我手动查询序列时可以找到:

SELECT COUNT(*) FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[SEQUENCE_NAME]') AND type = 'SO'

我有点困惑,它说“缺少 table”。使用 oracle 可以正常工作。 mssql 不支持通过序列生成 id。

我的配置:

spring:
  datasource:
    url: "jdbc:sqlserver://localhost:1433"
    username: sa
    password: ABc12345!
  jpa:
    properties:
      hibernate.dialect: org.hibernate.dialect.SQLServerDialect

我使用这个 docker 镜像:mcr.microsoft.com/mssql/server:2017-CU12-ubuntu

【问题讨论】:

是的,SQL Server 不支持。请参阅liquibase.org/documentation/changes/create_sequence.html的数据库支持表 是的,但已创建序列。之后我可以查询它。 Select NEXT VALUE FOR SEQUENCE_NAME 也返回了一个新的 id。 嗯,也许你错误配置了 hibernate... 显示你的配置文件(默认为 application.properties/.yml) 我的意思不是整个文件,而是那些放置 JPA/Hibernate 属性的部分 我在上面的问题中添加了配置。 【参考方案1】:

我在配置中使用了错误的方言。 正确的是:

spring.jpa.properties.hibernate.dialect: org.hibernate.dialect.SQLServer2012Dialect

另一个用于不支持序列的旧服务器。

【讨论】:

【参考方案2】:

尝试将default_schema 添加到application.yml:

spring:
   jpa:
      properties:
         hibernate:
            default_schema: "dbo"

【讨论】:

这不起作用。问题还是一样。我现在意识到hibernate_sequence 也会出现错误

以上是关于模式验证:使用 Hibernate 序列生成器策略时缺少表 [SEQUENCE_NAME]的主要内容,如果未能解决你的问题,请参考以下文章

hibernate中的主键生成策略

Hibernate常用主键生成策略

主键生成策略

Hibernate通过将前一个递增100来生成下一个序列号

Hibernate——主键生成策略CRUD 基础API区别的总结 和 注解的使用

Hibernate3主键生成策略