You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot应用启动失败,entityManagerFactory创建报错:No Dialect mapping for JDBC type: 1111

Spring Boot应用启动失败,entityManagerFactory创建报错:No Dialect mapping for JDBC type: 1111

看起来你遇到了Spring Boot启动时JPA实体管理器工厂创建失败的问题,核心错误是No Dialect mapping for JDBC type: 1111,别着急,我来帮你分析原因和解决办法:

错误原因解析

这个报错本质是Hibernate的数据库方言(Dialect)无法识别数据库返回的JDBC类型1111(对应SQL标准的OTHER类型),常见触发场景有:

  • 实体类中使用了Hibernate默认不支持的数据库字段类型(比如MySQL的JSONJSONB类型)
  • 数据库表中存在Hibernate无法自动映射的字段类型,而实体类没配置对应的类型转换器
  • 方言配置过时,比如用了MySQL5Dialect但数据库是MySQL 8.x,导致新类型不被兼容

具体解决方案

1. 修正实体类的字段类型映射(针对JSON等特殊类型)

从你的依赖来看,已经引入了hibernate-types-5库,正好可以用它来处理JSON这类特殊字段。比如实体类中有JSON类型字段的话,修改如下:

import com.vladmihalcea.hibernate.type.json.JsonStringType;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;

// 先定义全局的JSON类型转换器
@TypeDef(name = "json", typeClass = JsonStringType.class)
public class Customer {
    // 其他字段...
    
    // 给JSON字段指定类型
    @Type(type = "json")
    @Column(columnDefinition = "json")
    private String customerInfo;
    
    // 其他字段...
}

2. 更新Hibernate方言配置

如果你的数据库是MySQL 8.x版本,而配置文件里用的是旧版方言,建议替换为适配高版本的方言:
application.properties中修改:

# 替换原来的MySQL5Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

MySQL8Dialect对新的数据库字段类型支持更完善,能避免不少类型映射问题。

3. 检查数据库表与实体类的匹配度

如果开启了自动建表(spring.jpa.hibernate.ddl-auto=create/update),可以先手动删除现有表再重启应用;或者检查实体类中是否有字段定义了不合理的columnDefinition,导致Hibernate生成的SQL字段类型无法被当前方言识别。

4. 自定义方言扩展(兜底方案)

如果以上方法都无效,可以自定义一个方言,手动添加对JDBC类型1111的映射:

package customer.example.customer; // 替换成你的包名

import org.hibernate.dialect.MySQL8Dialect;

public class CustomMySQLDialect extends MySQL8Dialect {
    public CustomMySQLDialect() {
        super();
        // 将JDBC类型1111映射为String类型
        registerHibernateType(1111, String.class.getName());
    }
}

然后在配置文件中指定这个自定义方言:

spring.jpa.properties.hibernate.dialect=customer.example.customer.CustomMySQLDialect

备注:内容来源于stack exchange,提问作者Ranasinghe R.P.C.P

火山引擎 最新活动