详细信息

有关通过您最喜欢的依赖关系管理构建工具使用发布的信息,请参阅 https://hibernate.com.cn/orm/downloads/

使用 PostgreSQL81Dialect 及其子类处理 Clob 值的更改

对使用 PostgreSQL81Dialect 及其子类处理 Clob 值的方式进行了重大更改。以下内容复制自 迁移指南

直到包括 5.2.8,带有 @Lob 注解的 Clob 值和 Stringcharacter[]Character[] 属性的值

  • 使用数据(使用 PreparedStatement#setClobCallableStatement#setClob)的 Clob 表示形式绑定;

  • 作为 Clob 值检索(使用 ResultSet#getClobCallableStatement#getClob),然后将其转换为适当的 Java 类型;

  • 作为 PostgreSQL 大对象存储;即,值的 OID 存储在 text 列中,该列引用存储在不同(特定于 PostgreSQL 的)表中的实际数据。

在 5.2.9 和 5.2.10 中,由于对 HHH-11477 的修复,带有 @Lob 注解的 Clob 值和 Stringcharacter[]Character[] 属性的值

  • 使用数据(使用 PreparedStatement#setStringCallableStatement#setString)的 String 表示形式绑定;

  • String值检索(使用ResultSet#getStringCallableStatement#getString),然后转换为适当的Java类型;

  • 存储为变长字符字符串。

在5.2.11中,对HHH-11477的修复已被撤销(HHH-11614),以恢复5.2.8的行为。

因此,这些更改导致使用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值以及标注了@LobStringcharacter[]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 ) )

返回顶部