Hibernate 6.6.0.CR1

发布者:    |       Hibernate ORM 发布

Java数据

Hibernate 6.6 包含了 Jakarta Data 1.0 的完全认证兼容实现。如此处所述,我们的实现

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

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

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

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

  • Java数据 API,jakarta.data-api

例如,在 Gradle 中

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

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

有关更多信息,请参阅全新的 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)

在数组中查找element的位置

在数组输入上使用array_position语义覆盖position函数

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

将数组转换为String

支持将数组转换为字符串

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,
    -- ...
)

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

Oracle Vector支持

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

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

@OneToMany(mappedBy)@Any支持

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

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

对通过键加载的@Filter支持

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

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

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


返回顶部