我正在阅读 Hibernate Reactive 的doc,我遇到了这样的说法:
”另一方面,在 Hibernate Reactive 中,惰性关联获取是一个异步过程,它通过 CompletionStage(或 Uni)产生结果。 因此,惰性抓取是一个显式操作......”
我可能缺乏一些知识,使我无法理解该陈述的含义。为什么延迟关联获取是一个异步过程,导致它不像标准 Hibernate 那样透明?这里的挑战或障碍是什么?
来自文档中的示例:
session.find(Author.class, author.id)
.chain( author -> Mutiny.fetch(author.books) )
.invoke( books -> ... )
为什么我们必须显式链接
fetch
方法来声明,在某些时候,应用程序可能需要从数据库加载书籍?标准 Hibernate 不需要它。
请尽量不要含糊回答。我想深入了解这个问题。
谢谢!
因为在 HR 中,每次与数据库的交互(包括延迟获取)都是异步的,因此每个此类操作都必须返回一个表示“未来”结果的特殊对象。
获取
author.books
的操作不能返回Set<Book>
,因为那需要同步获取集合。相反,它必须返回Uni<Set<Book>>
.
并且由于我们在域模型中没有
Uni<Set<Book>>
(我们不想用Uni
污染域模型),我们使用fetch()
方法将类型Set<Book>
映射到Uni<Set<Book>>
.