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

Hibernate生成SQL给LONGTEXT加引号致MariaDB建表失败

问题:Spring Boot 3.3.3 + MariaDB 11.2.2 数据表创建失败(LONGTEXT被添加反引号)

问题现象

在Spring Boot 3.3.3应用中,向Docker部署的MariaDB 11.2.2-jammy实例创建数据表时失败。生成的SQL语句里,LONGTEXT类型被错误添加反引号,导致数据库报错“Unknown data type: 'LONGTEXT'”,手动移除反引号后SQL可正常执行。

实体类代码

@Entity
public final class Answer {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    @Column(columnDefinition="LONGTEXT")
    private String text;
}

错误日志

Hibernate: create table `answer` (`id` bigint not null, `text` `LONGTEXT` not null, primary key (`id`)) engine=InnoDB
2024-09-19 23:59:21.367 [main] WARN  o.m.jdbc.message.server.ErrorPacket : Error: 4161-HY000: Unknown data type: 'LONGTEXT'
2024-09-19 23:59:21.367 [main] WARN  o.h.t.s.i.ExceptionHandlerLoggedImpl: GenerationTarget encountered exception accepting command : Error executing DDL "create table `answer` (`id` bigint not null, `text` `LONGTEXT` not null, primary key (`id`)) engine=InnoDB" via JDBC [(conn=415) Unknown data type: 'LONGTEXT']

附加配置信息

pom.xml依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope> <!-- for local development -->
</dependency>
<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>3.4.1</version>
</dependency>

Docker环境变量配置

- SPRING_DATASOURCE_URL=jdbc:mariadb://mariadb:3306/${MYSQL_DATABASE}
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=org.mariadb.jdbc.Driver
- SPRING_DATASOURCE_INITIALIZATION_MODE=always
- SPRING_H2_CONSOLE_ENABLED=false
- SPRING_JPA_HIBERNATE_DDL_AUTO=${SPRING_JPA_HIBERNATE_DDL_AUTO}
- SPRING_JPA_SHOW_SQL=true
- SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.MariaDBDialect

.env文件内容

MYSQL_DATABASE=redacted
SPRING_JPA_HIBERNATE_DDL_AUTO=create
SPRING_H2_CONSOLE_ENABLED=false

问题根源

当前配置的通用MariaDBDialect对columnDefinition中的类型名处理逻辑有误,错误将LONGTEXT识别为需要转义的数据库标识符(如表名、列名),自动添加了反引号。MariaDB会将带反引号的LONGTEXT视为自定义标识符而非内置数据类型,因此触发报错。另外,Spring Boot 3.3.3对应的Hibernate 6.x版本与旧版通用方言的兼容性问题,也可能加剧这类转义错误。

解决思路

1. 使用匹配MariaDB版本的具体方言

将SPRING_JPA_DATABASE_PLATFORM配置为对应MariaDB 11.x的专属方言,新版本方言能精准识别内置数据类型,避免错误转义:

SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.MariaDB106Dialect

2. 移除columnDefinition,依赖Hibernate自动映射

无需手动指定LONGTEXT,用@Lob注解让Hibernate根据方言自动适配数据类型:

@Entity
public final class Answer {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    @Lob
    private String text;
}

或者直接保留@NotNull,去掉@Column(columnDefinition="LONGTEXT"),Hibernate会自动将长字符串映射为MariaDB的LONGTEXT类型。

3. 全局禁用标识符自动转义(备选)

如果必须保留columnDefinition,可添加配置禁用全局标识符引号,但此设置会影响所有标识符处理,可能引发其他问题:

SPRING_JPA_PROPERTIES_HIBERNATE_GLOBALLY_QUOTED_IDENTIFIERS=false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:57:14