在标准实现中,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即可,问题就可以解决了。