架构验证:使用Hibernate序列生成策略时缺少表[SEQUENCE_NAME]

3

我在使用hibernate生成Id时,遇到了一些与微软SQL Server相关的问题。

在我的应用程序中,我使用GenerationType.SEQUENCE来生成Ids。

@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'

我有点困惑,它说“缺少表格”,在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 中不支持此功能。请参考 https://www.liquibase.org/documentation/changes/create_sequence.html 上的“数据库支持”表格。 - Nikolai Shevchenko
是的,但是这个序列已经被创建了。我之后可以查询它。而且 Select NEXT VALUE FOR SEQUENCE_NAME 返回一个新的id。 - Leon
嗯,也许你已经配置错误了 Hibernate...请展示你的配置文件(默认为 application.properties/.yml)。 - Nikolai Shevchenko
我是指不是整个文件,而是放置JPA/Hibernate属性的部分。 - Nikolai Shevchenko
我已经在上面的问题中添加了配置。 - Leon
2个回答

4

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

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

另一个是针对不支持序列的旧服务器的解决方案。

0

尝试在application.yml中添加default_schema

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

这个不起作用。问题仍然存在。我现在意识到hibernate_sequence也会出现错误。 - Leon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接