首页  >  文章  >  Java  >  为什么 Hibernate Criteria 在使用 FetchType.EAGER 时返回子级的多个副本?

为什么 Hibernate Criteria 在使用 FetchType.EAGER 时返回子级的多个副本?

DDD
DDD原创
2024-10-27 04:29:29412浏览

Why Does Hibernate Criteria Return Multiple Copies of Children When Using FetchType.EAGER?

Hibernate Criteria 返回具有 FetchType.EAGER 的多个子副本

在 Hibernate 中映射一对多关系时,例如Order 类具有 OrderTransactions 列表,通常使用 FetchType.EAGER 设置在父实体初始化期间急切地获取子实体。然而,当将此设置与 Hibernate Criteria 一起使用时,会出现一个奇怪的现象。

查询结果重复订单

考虑以下场景:一个 Order 类是用以下列表定义的OrderTransactions 和 Criteria 查询用于根据订单状态过滤订单。使用默认的 FetchType.LAZY 设置,结果列表按预期包含唯一的 Order 实例。但是,在为 OrderTransaction 映射设置 FetchType.EAGER 后,Order 实例开始在结果中多次出现。

FetchType.EAGER 的预期行为

尽管使用 FetchType.EAGER 重复订单可能看起来出乎意料,它与底层 SQL 行为一致。执行外连接(由于 FetchType.EAGER 导致发生)时,结果集包含父实体和子实体的所有潜在组合,从而在存在多个子实体时导致父实例重复。

解决方案

为了即使使用 FetchType.EAGER 也能获得不同的 Order 结果,Hibernate 提供了一种解决方法:

<code class="java">Collection result = new LinkedHashSet(session.createCriteria(...).list());</code>

此代码片段使用 LinkedHashSet 过滤掉重复的 Order 引用,确保结果列表仅包含唯一的 Order 实例。

或者,如果目标是完全阻止联接提取并坚持延迟加载,只需将 FetchType 设置恢复为 FetchType.LAZY。

以上是为什么 Hibernate Criteria 在使用 FetchType.EAGER 时返回子级的多个副本?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn