环境
系统平台:Microsoft Windows (64-bit) 10
版本:5.6.4
症状
数据库从mysql迁移到hgdb后,Clob对应改为TEXT,Blob对应改为BYTEA,在应用系统调用列表查询报错

问题原因
以BYTEA为例,PostgreSQL的两种处理方式是通过分别调用JDBC的setBinaryStream()和setBlob()接口来实现的。期望的逻辑应该是Hibernate能针对PostgreSQL的这个特点来正确区分、正确调用,但不幸的是:Hibernate以为所有数据库都是调用setBinaryStream()来写入BYTEA,出于某种原因并不打算照顾PostgreSQL的特殊情况(貌似一段时间内不会改观),于是前面提到的错误现象发生了。
至于TEXT,情况大致类似,只是调用的是另外两个JDBC接口,不再展开。
解决方案
两种针对BYTEA的解决思路:
1、在定义EJB时,将blob类型改为byte[]。
2、重载Hibernate中的PostgresDialect类的useInputStreamToInsertBlob()方法。
三种针对TEXT的解决思路:
1、定义EJB时,取消@Lob标注,按String对待。
2、定义EJB时,保留@Lob标注,增加 @Type(type = “org.hibernate.type.TextType”)标注。
3、不修改EJB,重载PostgresDialect类remapSqlTypeDescriptor()方法,将CLOB当longvarchar处理。
import java.sql.Types;
import org.hibernate.dialect.PostgreSQL94Dialect;
import org.hibernate.type.descriptor.sql.LongVarbinaryTypeDescriptor;
import org.hibernate.type.descriptor.sql.LongVarcharTypeDescriptor;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
public class PgDialect extends PostgreSQL94Dialect
{
@Override
public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor)
{
switch (sqlTypeDescriptor.getSqlType())
{
case Types.CLOB:
return LongVarcharTypeDescriptor.INSTANCE;
case Types.BLOB:
return LongVarbinaryTypeDescriptor.INSTANCE;
}
return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
}
}
解决HgDB中Blob/Clob查询报错
1429

被折叠的 条评论
为什么被折叠?



