Hibernate 6.6.0.Final

发布者:    |       Hibernate ORM 发布

Jakarta Data

Hibernate 6.6 包含了 Jakarta Data 1.0 的完整实现。如此处所讨论,我们的实现

  • 基于编译时代码生成,通过注解处理器实现前所未有的编译时类型安全,并且

  • 由 Hibernate 的 StatelessSession 支持,该功能特别增强以适应 Jakarta Data 的需求。

Hibernate 6.6 已认证为兼容实现。

要使用 Hibernate 数据仓库,您需要依赖于

  • 我们的注解处理器 hibernate-jpamodelgen

  • Jakarta Data API,jakarta.data-api

例如,在 Gradle 中

implementation 'jakarta.data:jakarta.data-api:1.0.0'
implementation 'org.hibernate.orm:hibernate-core:6.6.0.Final'

annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen:6.6.0.Final'

有关更多信息,请参阅全新的 Hibernate 数据仓库 文档

@ConcreteProxy

6.6 还提供了一个新的 @ConcreteProxy 注解,作为已弃用的 @Proxy@LazyToOne 注解的改进替代品。表示应将延迟引用实例化为具体类型而不是引用类型。

考虑以下模型和数据

@ConcreteProxy
@Entity
@Inheritance
class Payment { ... }

@Entity
class CardPayment extends Payment { ... }

session1.persist( new CardPayment( 1, ... ) );

作为一个简单的例子 -

Payment loaded = session2.getReference( Payment.class, 1 );

历史上,Hibernate 会为 loaded 类型的 Payment 创建一个延迟代理。尝试将该引用转换为 CardPayment 将导致转换错误。@ConcreteProxy 强制 Hibernate 解析实际的具体类型并创建该类型的代理 -

CardPayment loaded = (CardPayment) session2.getReference( Payment.class, 1 );
Hibernate 将尝试多种不同的方法来确定具体类型,但最终可能不得不回退到访问数据库,这可能会影响性能。

此功能与 Hibernate 的传统基于代理的延迟和较新的字节码增强延迟一起工作。

扩展数组支持

ORM 6.6 增加了映射可嵌入聚合类型数组的支持,例如。

@Entity
class MyEntity {
        List<MyEmbeddable> embeddableAggregateList;
}

@Struct
@Embeddable
class MyEmbeddable { ... }

数组函数的语法糖

添加了大量的数组操作语法糖

函数 语法糖

array(1, 2)

[1, 2]

数组构造的简写括号语法

array_slice(array, 1, 2)

array[1:2]

数组切片的简写括号语法

array_length(array)

length(array)

在数组输入上以array_length语义重载length函数

array_position(array, element)

在数组中查找元素的索引

在数组输入上以array_position语义重载position函数

array_to_string(array, ',', 'null')

将数组转换为字符串

支持将数组转换为字符串

array_contains(array, element)

array contains elementelement in array

包含谓词用于包含检查

array_includes(array, array)

数组包含子数组

子集检查谓词

array_intersects(array, array(1, 2))

数组与[1, 2]相交

重叠谓词用于重叠检查

字符串函数的语法糖

现在括号语法也可以用于字符串类型表达式,通过索引选择单个字符,或通过起始和结束索引获取子字符串。

stringPath[2]substring(stringPath, 2, 1) 的语法糖,并返回一个 CharacterstringPath[2:3]substring(stringPath, 2, 3-2+1) 的语法糖,其中 3-2+1 是确定所需字符串长度的表达式。

可嵌入继承

本版本的新特性之一是针对 @Embeddable 类型的基于鉴别器的继承。一个 @Embeddable 类可以被其他 @Embeddable 类扩展,在这种情况下,使用该类型的 @Embedded 属性将依赖于一个额外的鉴别器列来存储关于复合值子类型的有关信息。

当检索继承的嵌入属性时,Hibernate 将读取鉴别器值并实例化正确的带有相应属性的 @Embeddable 子类型。

例如,如下映射

@Embeddable
@DiscriminatorValue( "parent" )
@DiscriminatorColumn( name = "embeddable_type" )
class ParentEmbeddable implements Serializable {
        private String parentProp;
        // ...
}

@Embeddable
@DiscriminatorValue( "child_one" )
class ChildOneEmbeddable extends ParentEmbeddable {
        private Integer childOneProp;
        // ...
}

@Entity
class TestEntity {
        @Embedded
        private ParentEmbeddable embeddable;
        // ...
}

将导致以下表结构

create table TestEntity (
    -- ...
    embeddable_type varchar(31) not null,
    parentProp varchar(255),
    childOneProp integer,
    -- ...
)

您可以选择使用根可嵌入类型的 @DiscriminatorColumn 注解来自定义鉴别器列属性,并可以使用 @DiscriminatorValue 注解选择每个子类型的鉴别器值,就像实体一样。

有关更详细的信息,请参阅可嵌入继承用户指南章节

Oracle Vector支持

Oracle工程师将向量数据类型和函数的支持贡献给了hibernate-vector模块,以与Oracle数据库版本23.4及更高版本一起使用。

有关向量的更多信息,请参阅Oracle文档

@OneToMany(mappedBy)@Any的支持

到目前为止,@OneToMany的目标必须是@ManyToOne。要基于任意关联映射@OneToMany,需要编写自定义的@SQLRestriction并指定连接列。

现在支持针对@Any关联的目标,并将默认使用适当的连接列,同时还会自动为@OneToMany添加一个@SQLRestriction

@Filter对加载键的支持

过滤器可以选择通过设置@FilterDef(applyToLoadByKey = true)来适用于查找键操作,如Session.find(),延迟初始化和一对一关联获取。

如果关联的目标行由启用了加载键的过滤器过滤,Hibernate ORM将抛出EntityFilterException以防止在刷新拥有此类关联的实体时可能发生的潜在数据丢失。

此外,@TenantId过滤器现在默认应用于加载键操作。


回到顶部