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 查询 来尝试语法和实验测试数据,以及 即时生成迁移脚本。

我们还在致力于改进 Hibernate Reactive 扩展,提供对 命名数据源和命名持久化单元 的支持。
此外,为了提供更好的用户体验,Quarkus 和 Hibernate 团队一直在持续合作进行性能和效率改进。例如,一项 避免需要 IdentityHashMap
来跟踪持久化实体 的优化,在运行一个简单的 100-1000 个不可变实体查询时,将性能提高了 8%,而在处理持久化集合时甚至更高。而这只是众多改进中的一项,也并非最后一项:未来预计会有更大的性能改进。
看看新版本,让我们知道您的想法!