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