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中文网其他相关文章!