Quarkus 上的 Hibernate ORM 7:每个新版本都带来更好的数据库体验

简介

Hibernate ORM 的发展速度非常快,其与 Quarkus 的集成也是如此,因为出色的数据库访问是 Quarkus 体验的关键组成部分。最新的 Quarkus 3.24 版本将 Hibernate 升级到 7.0 版本,这是一个重大的升级,意味着一些破坏性的更改,因此在升级时需要注意 迁移指南。Hibernate 和 Quarkus 的开发人员一直在合作,所以这里快速浏览一下过去几个月发生的事情以及 Quarkus 用户未来可以期待什么。

许可证和治理更新

Quarkus 和 Hibernate 现在都是 Commonhaus 基金会的项目,这是一个致力于为开源库创建协作环境的非营利组织。自升级到 Hibernate 7 以来,Quarkus 和所有 Hibernate 库现在共享相同的开源许可证:Apache 许可证 2.0 版本

Hibernate ORM 7.0 更新

新版本的 Hibernate 带来了更好的性能和 各种新功能,其中一些功能改善了开发人员体验,例如使用 findMultiple()getMultiple() 来高效地批量获取实体。

对 Jakarta Data 的支持

Jakarta Data 是一种更简单的编写数据访问应用程序的方法,自 2024 年 11 月以来一直在 Quarkus 中得到支持。我们建议您尝试一下,因为它能够非常快速轻松地实现 DAO/存储库模式,没有任何样板代码,并且是类型安全的。要开始使用,只需包含 jakarta.data:jakarta.data-api 依赖项以及最新版本的 Quarkus,即。

<dependency>
       <groupId>jakarta.data</groupId>
       <artifactId>jakarta.data-api</artifactId>
 </dependency>

以下是如何编写简单存储库的示例

@Repository
public interface Library {

    @Find
    Optional<Book> byIsbn(String isbn);

    @Query("""
            select b.isbn, b.title, listagg(a.name, ' & ')
            from Book b join b.authors a
            group by b
            order by b.isbn
            """)
    List<Summary> summarize();
}

这个主题值得深入探讨,如果您有兴趣,请告诉我们,我们可以提供更多内容。

在此期间,您可以随时参考 专门的 Quarkus 指南 快速入门,并参考 Hibernate ORM 中相应的文档 以获得更高级的用法。

新的 Restrictions API

在旧的 Hibernate Criteria API 被弃用后,开发人员仍然怀念它的简洁性,因此 Hibernate 团队引入了一个新的 Restrictions API,它甚至具有新功能,例如可以进一步限制已编写的 JPQL/HQL 查询。

List<Book> books =
    SelectionSpecification.create(Book.class,
        """
            from Book where discontinued = false
        """)
        .restrict(Restriction.startsWith(Book_.title, "hibernate"))
        .sort(Order.desc(Book_.title))
        .createQuery(session)
        .setPage(Page.first(50))
        .getResultList();

此功能也可与 Hibernate Data Repositories(Jakarta Data API 的 Hibernate 实现)一起使用,并创建一个允许过滤而无需编写任何 JPQL/HQL 代码的存储库。

@Find
List<Book> books(Restriction<Book> restriction,
                 Order<Book> order);

当用户调用该方法时,他们可以传递 Restriction 对象来过滤所需的书籍。

var books =
       library.books(Restriction.contains(Book_.title, "Hibernate"),
                     Order.of(_Book.title.ascIgnoreCase(),
                              _Book.isbn.asc()));

Hibernate Reactive 与 Hibernate ORM 一起使用

一项备受期待的功能是能够在同一个 Quarkus 应用程序中 混合使用 Hibernate ORM 和 Hibernate Reactive 扩展。没有这项功能,要让这两个扩展共存需要一些现在不再需要的变通方法:自 Quarkus 3.24 起,现在可以混合使用这两个扩展。

Hibernate Reactive 是一个强大的响应式数据访问抽象,但其优势因项目而异。我们不强制规定用法,而是让用户能够轻松地试验 Hibernate ORM 和 Reactive。使用 Hibernate ORM 的项目可以添加 Reactive 扩展,重用映射实体创建响应式资源,运行测试和基准测试,并确定它是否适合其特定需求和可伸缩性目标。在使用两者时,更容易为不同的用例选择最适合的方法。另一个好处是,它使得在必要时更容易分小步从一个迁移到另一个。

Panache 用户也将从 Panache 2.0 开始拥有此可能性。

注入 SchemaManager

Hibernate Schema Manager 是一个强大的工具,可以从 Java 对象生成 DDL 脚本。现在可以通过依赖注入在 Quarkus 中使用其功能。这在 编写测试 时特别有用,可以让您以编程方式控制何时执行模式导出、模式验证、数据清理和模式清理。

未来

团队对这些重要项目的未来有很多计划:Quarkus 的 DevUI 将得到增强,改善开发人员体验,并有可能 执行任意 HQL 查询 来尝试语法和实验测试数据,以及 即时生成迁移脚本

console

我们还在致力于改进 Hibernate Reactive 扩展,提供对 命名数据源和命名持久化单元 的支持。

此外,为了提供更好的用户体验,Quarkus 和 Hibernate 团队一直在持续合作进行性能和效率改进。例如,一项 避免需要 IdentityHashMap 来跟踪持久化实体 的优化,在运行一个简单的 100-1000 个不可变实体查询时,将性能提高了 8%,而在处理持久化集合时甚至更高。而这只是众多改进中的一项,也并非最后一项:未来预计会有更大的性能改进。

看看新版本,让我们知道您的想法!