Hibernate ORM 6.2.0 最终版已发布。
在许多方面,这个版本标志着围绕更改 Hibernate 生成 SQL 的 6.x 重大关注的最终步骤。在这个版本中以及 6.0 和 6.1 中,许多改进都是基于 SQL AST 工作实施的。从 6.0 和 6.1 开始,Hibernate 使用这个 SQL AST 从数据库加载数据。随着 6.2 的发布,Hibernate 也开始使用 SQL AST 将数据写入数据库。
支持结构化 SQL 类型
Hibernate 现在支持结构化 SQL 类型,包括结构、XML 和 JSON。Christian 写了一篇关于此支持的博客文章,详细介绍了该功能。请参阅博客文章,以及聚合可嵌入映射和@Struct 聚合可嵌入映射用户指南部分。
支持 Java 记录
Hibernate 现在支持将 Java 记录映射为可嵌入对象。例如。
@Embeddable
public record Name(
String firstName;
String lastName;
) {}
甚至结合支持结构化 SQL 类型以持久化到结构中!
@Embeddable
@Struct(name = "Name")
public record Name(
String firstName;
String lastName;
) {}
有关详细信息,请参阅@Struct 聚合可嵌入映射用户指南部分。
统一生成值支持
对生成持久化值的支持已被统一,无论是标识符还是其他基本值,都基于 org.hibernate.annotations.Generated
、org.hibernate.annotations.ValueGenerationType
和 org.hibernate.generator.Generator
。例如。
@Generated( GenerationTime.INSERT )
@ColumnDefault( "CURRENT_TIMESTAMP" )
private Date createdDate;
或者
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE } )
@ValueGenerationType( generatedBy = UuidValueGeneration.class )
public @interface GeneratedUuidValue {
GenerationTiming timing();
}
public static class UuidValueGeneration implements BeforeExecutionGenerator {...}
...
@GeneratedUuidValue( timing = GenerationTiming.INSERT )
public UUID createdUuid;
请参阅生成属性用户指南部分以获取详细信息。
数据库分区
Hibernate 现在支持使用 org.hibernate.annotations.PartitionKey
将分区列映射为数据库分区,作为一等公民。例如。
@Entity
public static class User {
@Id private Integer id;
...
@PartitionKey private String region;
}
请参阅分区用户指南部分以获取详细信息。
对“可选表”的SQL MERGE更新
在SQL AST的基础上,Hibernate现在可以使用SQL MERGE
命令来处理对可选表的更新。
对可选表的更新将产生三种最终结果之一
-
如果没有对应的行已经存在于表中,则插入该行
-
否则如果所有新的“值”列都是null,则删除该行
-
否则更新该行
传统的行为是在运行时自行执行这些if检查,并分别执行插入、更新和删除语句。而MERGE
命令允许在单个JDBC调用中更高效地完成这些操作。
目前此功能支持以下数据库
默认回退是使用传统的行为。