栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

hibernate No Dialect mapping for JDBC type 1111 问题解决方案

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

hibernate No Dialect mapping for JDBC type 1111 问题解决方案

No Dialect mapping for JDBC type: 1111 问题解决方案 报错原因

因为每个数据库都有各自的方言,而方言简单理解来说其实就是对某些数据库独有的数据类型,函数之类的做一个映射关系,而1111就是因为不存在映射关系,所以找不到方言对应值

package org.hibernate.dialect;

public final class TypeNames {
	
	public String get(final int typeCode) throws MappingException {
		final Integer integer = Integer.valueOf( typeCode );
		final String result = defaults.get( integer );
		if ( result == null ) {
			throw new MappingException( "No Dialect mapping for JDBC type: " + typeCode );
		}
		return result;
	}
    
    ...
}

从上面的代码来看,typeCode为1111的时候,defaults中不存在key为1111的值,并不存在映射,所以抛出异常

package org.hibernate.dialect;

public abstract class Dialect implements ConversionContext {
    protected Dialect() {
        // standard sql92 functions (can be overridden by subclasses)
		registerFunction( "substring", new SQLFunctionTemplate( StandardBasicTypes.STRING, "substring(?1, ?2, ?3)" ) );
		registerFunction( "locate", new SQLFunctionTemplate( StandardBasicTypes.INTEGER, "locate(?1, ?2, ?3)" ) );
		registerFunction( "trim", new SQLFunctionTemplate( StandardBasicTypes.STRING, "trim(?1 ?2 ?3 ?4)" ) );
        ...
        //map second/minute/hour/day/month/year to ANSI extract(), override on subclasses
		registerFunction( "second", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "extract(second from ?1)") );
		registerFunction( "minute", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "extract(minute from ?1)") );
		registerFunction( "hour", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "extract(hour from ?1)") );
        ...
        registerColumnType( Types.BIT, "bit" );
		registerColumnType( Types.BOOLEAN, "boolean" );
		registerColumnType( Types.TINYINT, "tinyint" );
        ...
        // register hibernate types for default use in scalar sqlquery type auto detection
		registerHibernateType( Types.BIGINT, StandardBasicTypes.BIG_INTEGER.getName() );
		registerHibernateType( Types.BINARY, StandardBasicTypes.BINARY.getName() );
		registerHibernateType( Types.BIT, StandardBasicTypes.BOOLEAN.getName() );
        ...
    }
    
    ...
}

上面的代码中则是hibernate方言类中默认的映射,每个数据库有不同的映射,所以不同数据库的方言包继承于该类,进行一些独有类型的映射关系

package java.sql;

public class Types {
    
        
        public final static int BIT             =  -7;

        
        public final static int TINYINT         =  -6;

        
        public final static int SMALLINT        =   5;

        
        public final static int INTEGER         =   4;

        
        public final static int BIGINT          =  -5;
    
        
        public final static int OTHER           = 1111;
    
    ...
}
解决方案

从上面代码中可以看出1111是other,不像是会被映射的类型

所以我们手动的去将关系对应起来,而1111代表的是什么,我们并不知道。而我是通过报错的sql找到对应的表,查看表结构中的离奇类型,然后查看是否有对应关系,没有的话就手动添加映射关系

我项目中出现的问题是kingbase的数据库中有个表的字段类型为serial,这个在方言中不存在映射关系,所以我手动的去添加了映射

public class Kingbase8Dialect extends org.hibernate.dialect.Kingbase8Dialect {

    public Kingbase8Dialect() {
        // 添加other的映射 即1111
        this.registerHibernateType(Types.OTHER, StandardBasicTypes.BIG_INTEGER.getName());
        // 一些其他的映射关系
        
    }
}

方言设置好后,需要在hibernate配置方言

spring:
  jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
      	#dialect: org.hibernate.dialect.Kingbase8Dialect
   		#修改到我们自己的方言类
        dialect: com.xxx.xxx.Kingbase8Dialect
        

至此,该问题则算被解决掉

总结

有些问题,研究下,多看看源码,就可以了解问题出现的原因,从而解决问题。从我们当前这个问题来看,

我遇到并解决的只是一个 No Dialect mapping for JDBC type: 1111 的问题,但通过看源码,我们可以了解到很多衍生问题

比如以后再出现 No Dialect mapping for xxx 的问题,我们就立刻知道了是哪里的问题。

这就是我对于 No Dialect mapping for JDBC type: 1111 问题的解析以及解决方案,希望对正在观看的您有所帮助

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/759276.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号