原创

类型报错 No Dialect mapping for JDBC type -4

在标准实现中,JDBC驱动程序在后台使用SQL类型LOCATOR(BLOB)来实现Blob接口。LOCATOR(BLOB)指向保存在数据库服务器上的SQL BLOB值,而且这些操作作用在这个LOCATOR(定位器)上与作用在BLOB值本身有同样的结果。


在项目开发中使用mysql数据库时BLOB对象报以下错误:

Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: -4
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:56)
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:81)
    at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:370)
    ...


原因是实体某个属性类型导致如BLOB对象;解决方式修改mysql方言代码如下:

package com.util.dialect; 
import java.sql.Types; 
import org.hibernate.Hibernate; 
import org.hibernate.dialect.MySQL5Dialect; 
/**
 * 注册BLOB类型(String类型)
 * @author yoodb
 *
 */ 
public class PersonSQLDialect extends MySQL5Dialect { 
     public PersonSQLDialect () { 
   super(); 
   registerHibernateType(Types.LONGVARBINARY, Hibernate.BLOB.getName());
   //注册blob,Types.LONGVARBINARY的值就是-4
     } 
}


修改数据库配置文件,部分配置文件如下:

...
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/mysql"/> 
<property name="hibernate.connection.username" value="root"/> 
<property name="hibernate.connection.password" value="123456"/> 
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.provider_class" value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider"/>    
...

将上面的org.hibernate.dialect.MySQLDialect mysql方言修改为com.util.dialect.PersonSQLDialect即可,问题就可以解决了。

~阅读全文-人机检测~

微信公众号“Java精选”(w_z90110),专注Java技术干货分享!让你从此路人变大神!回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。微信搜索小程序“Java精选面试题”,内涵3000+道Java面试题!

涵盖:互联网那些事、算法与数据结构、SpringMVC、Spring boot、Spring Cloud、ElasticSearch、Linux、Mysql、Oracle等

评论

分享:

支付宝

微信