详细信息
-
tag 在 这里;
-
发布包位于 SourceForge 和 BinTray。
有关通过您最喜欢的依赖关系管理构建工具使用发布的信息,请参阅 https://hibernate.com.cn/orm/downloads/
使用 PostgreSQL81Dialect 及其子类处理 Clob 值的更改
对使用 PostgreSQL81Dialect 及其子类处理 Clob 值的方式进行了重大更改。以下内容复制自 迁移指南。
直到包括 5.2.8,带有 @Lob
注解的 Clob
值和 String
、character[]
和 Character[]
属性的值
-
使用数据(使用
PreparedStatement#setClob
或CallableStatement#setClob
)的Clob
表示形式绑定; -
作为
Clob
值检索(使用ResultSet#getClob
或CallableStatement#getClob
),然后将其转换为适当的 Java 类型; -
作为 PostgreSQL 大对象存储;即,值的
OID
存储在text
列中,该列引用存储在不同(特定于 PostgreSQL 的)表中的实际数据。
在 5.2.9 和 5.2.10 中,由于对 HHH-11477 的修复,带有 @Lob
注解的 Clob
值和 String
、character[]
和 Character[]
属性的值
-
使用数据(使用
PreparedStatement#setString
或CallableStatement#setString
)的String
表示形式绑定; -
以
String
值检索(使用ResultSet#getString
或CallableStatement#getString
),然后转换为适当的Java类型; -
存储为变长字符字符串。
因此,这些更改导致使用5.2.9之前的Hibernate版本持久化的数据无法使用5.2.9或5.2.10读取。使用Hibernate 5.2.9或5.2.10持久化的数据也无法使用5.2.11或更高版本读取。
在5.2.9和5.2.10中,可以通过覆盖PostgreSQL方言来使用以下方法恢复5.2.8/5.2.11的行为:
public SqlTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode) {
if( sqlCode == Types.CLOB ){
return ClobTypeDescriptor.CLOB_BINDING;
}
return super.getSqlTypeDescriptorOverride( sqlCode );
}
此外,任何使用5.2.9或5.2.10作为变长字符字符串存储的Clob
值以及标注了@Lob
的String
、character[]
和Character[]
属性值应更新为在迁移到5.2.11之前以PostgreSQL大对象形式存储。
例如,如果5.2.9或5.2.10存储了以下映射的变长字符字符串
@Entity(name = "TestEntity")
@Table(name = "TEST_ENTITY")
public static class TestEntity {
@Id
@GeneratedValue
private long id;
@Lob
String firstLobField;
@Lob
String secondLobField;
@Lob
Clob clobField;
...
}
可以通过执行以下SQL将变长字符字符串转换为PostgreSQL大对象
update test_entity
set clobfield = lo_from_bytea( 0, cast( clobfield as bytea ) ),
firstlobfield = lo_from_bytea( 0, cast( firstlobfield as bytea ) ),
secondlobfield = lo_from_bytea( 0, cast( secondlobfield as bytea ) )