【发布时间】:2023-01-22 11:29:46
【问题描述】:
我需要让我们的应用程序与 Postgresql、Oracle 和 SQL Server 一起工作。除了字符串属性中的 @Lob 映射外,所有 3 个数据库都工作正常。对于 Oracle 和 SQLServer 工作正常(varchar(max) 和 clob),但对于 Postgresql,我想要的是文本类型,但它被映射为 oid。
我所做的是为 Postgresql 创建一个方言并覆盖 getTypeName 和 remapSqlTypeDescriptor
@Override
public String getTypeName(int code, long length, int precision, int scale) throws HibernateException {
if (code == Types.CLOB) {
return super.getTypeName(Types.VARCHAR, length, precision, scale);
}
return super.getTypeName(code, length, precision, scale);
}
@Override
public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
if (sqlTypeDescriptor.getSqlType() == Types.CLOB) {
return VarcharTypeDescriptor.INSTANCE;
}
return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
}
有没有更好的方法来做到这一点?
实体中的属性
@Size(max = 300000)
@Column(name = "value")
@Lob
private String value;
通过这个映射,我得到了相同的结果
@Size(max = 300000)
@Column(name = "value")
@Type(type = "org.hibernate.type.MaterializedClobType")
@Lob
private String value;
从 Hibernate 创建句子:
org.hibernate.SQL : create table table (id int4 not null, value oid, primary key (id))
【问题讨论】:
标签: hibernate