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

SQL Server下JPA+Hibernate建表执行DDL报错如何解决?

问题根因分析

你遇到的报错和Hibernate方言无关,核心问题是SQL Server保留关键字冲突:
从生成的建表语句create table tenders (identity int identity not null, grade varchar(255), primary key (identity))可以看到,你的实体类主键字段命名为IDENTITY,而IDENTITY是SQL Server中用于定义自增列的保留关键字,直接作为字段名使用会导致SQL语法解析失败。

解决方案

方案1:修改主键字段名(最推荐)

将主键字段改为非关键字的名称,比如tenderId、id,避免关键字冲突,修改后的实体类代码如下:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="Tenders")
public class Tender {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private @NotNull int tenderId;
    private @NotNull String grade;
}

该方案兼容性最好,后续不会出现其他关键字相关的隐含问题。

方案2:转义保留关键字(仅用于必须保留原字段名的场景)

如果业务要求必须使用IDENTITY作为字段名,可以通过两种方式实现转义:

方式A:字段单独配置转义名称

在主键字段上添加@Column注解,用SQL Server的方括号转义关键字:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "[IDENTITY]")
private @NotNull int IDENTITY;

方式B:全局配置自动转义所有标识符

在application.properties中添加以下配置,让Hibernate自动给所有表名、字段名加上转义符:

spring.jpa.properties.hibernate.globally_quoted_identifiers=true
可选优化项

如果你的SQL Server版本为2016及以上,可以将方言替换为更适配的版本,提升兼容性:

spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2016Dialect

同时确认数据库连接账号拥有建表、修改表的权限,避免权限不足导致的DDL执行失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:15:02