Oracle 隐式数组类型
Oracle 中隐式创建的数组类型的名称略有更改,以处理已转换的类型。以前,隐式数组类型的命名只使用 Java 类型简名,当在不同的 JDBC 类型代码或转换器中使用相同的 Java 类型时,可能会产生冲突。为了避免名称冲突,隐式创建的数组类型命名现在还包括在首选的 Java 类型与字段类型不同时,JDBC 类型首选的 Java 类型简名。对于已转换的类型,将使用转换器 Java 类简名。
类型为 BigInteger[] 的持久属性的数组类型以前为 BigIntegerArray,现在为 BigIntegerBigDecimalArray,因为 NUMERIC/DECIMAL JDBC 类型的首选 Java 类型为 BigDecimal。要指定自定义数组类型名称,请使用 @Column(columnDefinition = “BigIntegerArray”) 为持久属性添加注释。
对 UserDefinedType 的更改
UserDefinedType 已重命名 UserDefinedObjectType,并且除了对列信息的访问之外的一切都在一个称为 UserDefinedType 的新接口中提炼出来。此举旨在允许对建模为 UserDefinedArrayType 的命名数组(它扩展新的 UserDefinedType 接口)和 UserDefinedObjectType(即结构数组)之间的依赖关系进行建模。
UserDefinedType 以前未明确用 @Incubating 作注释,但它是为 ORM 6.2 中的 incubation 型 @Struct 特性引入的,并且也使其有效地成为 incubation 型的。为了更清楚地说明这一点,这些类型现在还明确地标记为 @Incubating。
这些更改会影响以前在命名空间中查询或创建 UserDefinedType 的用户。返回或操作 UserDefinedType 的方法已标记为 @Incubating,以明确这些协定仍然可能演变。
另一项更改是对已经属于孵化期的 ColumnOrderingStrategy,其中 orderUserDefinedTypeColumns 的参数类型已从 UserDefinedType 更改为 UserDefinedObjectType。
使用 `array_includes` 子集检查数组
对将数组作为元素参数接受array_contains()
的支持已被弃用,并会发出警告。要检查数组是否为另一个数组的子集,请使用array_includes()
函数,或新INCLUDES
谓词,即array INCLUDES subarray
。
合并已删除行的版本化实体
先前,合并分离实体在数据库(例如,如果对象已在别的交易中已删除)中未匹配到行时,会导致 SQL insert
。此行为出乎意料,且违背了乐观锁定的规则。
现在,当确定实体绝对是已分离的且没有匹配行时,会抛出OptimisticLockException
。要进行此确定,实体必须具有
-
已生成的
@Id
字段,或 -
非基本
@Version
字段。
对于两者都没有的实体,无法区分新建实例和已删除分离实例,也不会更改之前行为。
为注释的类类型进行显式验证
在@Embedded
属性类型方面 Hibernate 向来很宽松,允许未使用 @Embeddable
注释的类仍然正常工作。这是一个不错的功能,让您能将属性映射到您无法修改以添加注释的类,并且将来会继续按预期方式工作。
不过,由此产生的一种影响是,让您可以在同一注释类中同时对@MappedSuperlcass
和 @Embeddable
进行使用,作为变通解决方法,以启用将子类注释为 @Embeddable
,并仍可在嵌入式属性映射中使用这两种类型。这从未得到官方支持,比如 JPA 静态元模型未按预期方式工作,且从 6.6 版开始,我们将明确验证被映射类是用 @MappedSuperclass
还是 @Embeddable
或 @Entity
注释的。
仍支持使用 @Embeddable
类型扩展 @MappedSuperclass
注释的类,但我们建议保持两种注释类类型分离开来。您现在还可以利用基于显式判别列的嵌入式继承。
基于辨别器的可嵌入继承
ORM 6.6 导入了对 @Embeddable
类型的继承的支持,始终依赖于存储在包含该类型多态 @Embedded
属性的实体映射中的判别列。请注意,此功能将自动启用对所有其类型(Java 类)由注释为 @Embeddable
的子类扩展的 @Embedded
属性。先前,始终忽略注释为 @Embeddable
的子类型,所以除非您正在使用前一章节中介绍的“变通方法”,否则这应不会影响您的映射。
对于可嵌入继承,我们还启用了 type()
和 treat()
函数来处理可嵌入类型路径。因此,org.hibernate.query.sqm.tree.domain.SqmTreatedPath#getTreatTarget()
方法现在将返回一个泛型 ManagedDomainType
对象,它反过来可能是 EntityDomainType
(这是之前的对象)或 EmbeddableDomainType
实例。
您可以在专门的 用户指南章节 中找到有关可嵌入继承的更多详细信息。
H2 数据库和大批量变更策略
在 ORM 6.6 中,当批量突变涉及多张表时,H2 方言将使用全局临时表,而不是局部临时表。
条件:`jakarta.persistence.criteria.Expression#as(Class)`
jakarta.persistence.criteria.Expression#as(Class)
的行为已更改为符合 Jakarta 持久性规范。
Expression.as()
不再进行真正的类型转换,它只是对 Expression 对象本身的不安全类型转换。
为了执行实际的类型转换,可以使用 org.hibernate.query.criteria.JpaExpression#cast(Class)
。
例如
( (JpaExpression) from.get( "theInt" ) ).cast( String.class )