Hibernate 6.2 最终版

发布者:    |       Hibernate ORM 发布

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.Generatedorg.hibernate.annotations.ValueGenerationTypeorg.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命令来处理对可选表的更新。

对可选表的更新将产生三种最终结果之一

  1. 如果没有对应的行已经存在于表中,则插入该行

  2. 否则如果所有新的“值”列都是null,则删除该行

  3. 否则更新该行

传统的行为是在运行时自行执行这些if检查,并分别执行插入、更新和删除语句。而MERGE命令允许在单个JDBC调用中更高效地完成这些操作。

目前此功能支持以下数据库

默认回退是使用传统的行为。

专有SQL类型

处理某些SQL类型需要访问特定于JDBC驱动的类,以便正确地读取和写入该类型的值。在某些环境中(例如各种容器),这些类对Hibernate不可用。

现在,当Hibernate能够处理这些情况时,它会更好地处理这些情况,通常基于转换为更标准化的类型。例如,我们可能通过将JSON表达式包装在cast函数中,将JSON值从ResultSet中读取为String。

社区

有关更多信息,请参阅

访问我们的网站以与我们取得联系。


回到顶部