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.EntityMode
、org.hibernate.tuple.Tuplizer
、org.hiberante.tuple.entity.EntityTuplizer
、org.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的完整变更日志。