Hibernate 6.6.0.CR2

作者:    |       Hibernate ORM 发布

Jakarta Data

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

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

  • 由 Hibernate 的 StatelessSession 支持,该 Session 已特别增强以满足 Jakarta Data 的需求。

要使用 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 会为类型为 Paymentloaded 创建一个延迟代理。尝试将该引用强制转换为 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)

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过滤器现在默认适用于按键加载操作。


回到顶部