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_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,
-- ...
)
有关更详细的信息,请参阅Embeddable继承用户指南章节。
Oracle Vector支持
Oracle工程师向hibernate-vector
模块贡献了对向量数据类型和函数的支持,以与Oracle数据库版本23.4及更高版本一起使用。
有关向量的更多信息,请参阅Oracle文档。