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 会为类型为 Payment
的 loaded
创建一个延迟代理。尝试将该引用强制转换为 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_length语义重载length函数 |
|
|
在数组输入上使用array_position语义重载position函数 |
|
|
支持将数组转换为字符串 |
|
|
包含谓词用于包含检查 |
|
|
子集检查谓词 |
|
|
重叠谓词用于重叠检查 |
字符串函数的语法糖
现在中括号语法也可以用于字符串类型的表达式,通过索引选择单个字符,或通过起始和结束索引获取子字符串。
stringPath[2]
是substring(stringPath, 2, 1)
的语法糖,并返回一个Character
。stringPath[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文档。