Hibernate ORM版本5.6.2.Final现已可用。

这是最新稳定分支5.6的维护版本;说到分支,值得注意的是,我们的main分支现在指向即将发布的版本6.0的源代码。

为Hibernate ORM 6做准备的反弃用功能

在版本5.6.1.Final中,我们标记了一些类型为弃用,目的是为Hibernate ORM 6做准备。

其中,我们已在版本5.6.1.Final中将org.hibernate.EntityModeorg.hibernate.tuple.Tuplizerorg.hiberante.tuple.entity.EntityTuplizerorg.hibernate.tuple.component.ComponentTuplizer标记为弃用,但许多用户指出,这种弃用是令人困惑的,因为它不是“可执行的”:因为没有替代API,他们除了忽略它们外没有其他解决这些弃用问题的方法。

因此,尽管这并不一定是弃用的意图,但我们决定倾听反馈,并将撤销这些弃用;其中一些已经被解决,但在发布时仍有一些弃用存在;最值得注意的是,org.hibernate.annotations.Type仍然被标记为弃用:我们将在下一个微版本中解决这个问题。

同时,无需惊慌:这仍然是定义自定义类型映射的最佳方式 - 使用此弃用警告是为了引起对其的关注,因为这个特定的API在版本6中将有所不同;现在可以忽略它。

对PostgreSQL方言中CLOB的DDL类型的更改

从5.6.2版本开始,默认的PostgreSQL DDL类型为CLOB列,即使用@Lob注解或java.sql.Clob类型的字段,将变为oid类型,而之前使用的是text类型。《text》类型不支持流式数据,即使经过TOAST压缩,也会被服务器急切地物化,这不符合LOB类型的使用预期。

不幸的是,所有的PostgreSQL JDBC驱动程序都将为java.sql.Clob创建的oid存储在text列中。虽然使用CLOB API读取值是可行的,但PostgreSQL并不知道LOB的引用,因为oid对PostgreSQL是未知的,当运行vacuumlo(清理未使用LOB的工具)时会导致数据丢失。为了避免数据丢失,需要使用oid类型,这样vacuumlo就能看到引用。

升级到5.6.2版本默认不需要对模式或应用程序进行任何更改,但我们强烈建议将现有的LOBtext列迁移到oid,以防止由于vacuumlo活动导致的数据丢失。

alter table test_entity
alter column clobfield
set data type oid using clobfield::oid

如果您正在重写JdbcTypeDescriptor以使用例如VarcharTypeDescriptor的自定义PostgreSQL方言,请注意,您还必须在自定义方言中重写列类型,因为在"pgjdbc"中,无法使用JDBC的ResultSet#getString/Statement#setString方法读取/写入oid列。

registerColumnType(Types.CLOB, "text");

或者,您可以删除JdbcTypeDescriptor重写并使用以下方法迁移到oid

alter table test_entity
alter column clobfield
set data type oid using lo_from_bytea(0, cast(clobfield as bytea))

将值切换到oid可能会对频繁检索的小值产生负面影响,因为即使对于小值,值也会存储在不同于行的不同文件系统页面上。但是,oid类型的优点是可以流式传输内容并减少行大小。

仅需要大型文本类型但不在乎流式传输的用户应使用Hibernate类型text

@Entity
public class TestEntity {

    @org.hibernate.annotations.Type(type = "text")
    String clobField;

    //...
}

这将对java.sql.Types.LONGVARCHAR进行映射,Hibernate方言将注册一个DDL类型,该类型支持通过ResultSet#getString/Statement#setString方法进行访问,即在PostgreSQL的情况下,类型为text

@Lob注解应仅用于强制使用JDBC的ResultSet#getClob/Statement#setClob驱动程序方法,这反过来又需要流式传输数据。

获取5.6.2.Final,详细变更日志

所有详细信息均可在hibernate.org上的专用页面找到。

5.6.2.Final的完整变更日志

反馈、问题、想法?

要取得联系,请使用常用渠道


返回顶部