我有 JPA 实体 Order 与客户的多对一关系。它是双向的,因此 Customer 也有一个 OneToMany 字段的订单。两种关系都使用 EAGER 获取(或在 OpenJPA 获取计划中)。
当我从 Order 中选择时,我得到 1 个选择的订单和 N 个选择的 Customer.orders 字段。令我惊讶的是,OpenJPA、EclipseLink 和 Hibernate 都存在这个问题,即使我使用 JOIN FETCH(它在单向情况下确实有效)。
有没有解决这个问题的好方法?对于更复杂的图形,是否有解决 N+1 选择问题的解决方案?
编辑:我自己的研究结果: - 对于 OpenJPA(我正在使用)我还不知道解决方案 - 对于 Hibernate @Fetch(FetchMode.SUBSELECT) 解决了这个问题。使用@BatchSize 也有帮助,它可以同时选择给定数量的 customer.orders 字段。- 对于 EclipseLink,我发现了一个类似的功能 @BatchFetch(value=BatchFetchType.IN) 但在这种情况下它没有帮助,我想它不能在双向关系中有效地处理这个问题。