【发布时间】:2012-11-04 05:11:01
【问题描述】:
我的 JPA 实体 Order 与 Customer 具有多对一关系。它是双向的,因此 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) 但在这种情况下它没有帮助,我想它不能有效地处理双向关系。
【问题讨论】:
-
这是一个有点漫不经心的问题。您有一个具体问题想要帮助解决还是只想投诉 JPA?
-
你说得对,我对 JPA 有点失望,我将编辑我的问题,使其更切中要害。
-
您真的需要 EAGER 获取 Customer.orders 吗?
-
@Esteve 你有一个很好的观点。在制作订单及其客户的简单列表时,您实际上并不需要这些客户的任何其他订单!仍然可能存在其他情况,您确实需要加载这样的字段,我认为可以在没有 N+1 选择的情况下选择它
标签: java sql performance jpa