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
相关产品推荐
相关产品推荐

