私は顧客とのManyToOne関係を持つJPAエンティティOrderを持っています。これは双方向であるため、Customer にも OneToMany フィールドの注文があります。どちらの関係も EAGER フェッチングを使用します (または OpenJPA フェッチプランにあります)。
Order から選択すると、注文に対して 1 つの選択が取得され、Customer.orders フィールドに対して N の選択が取得されます。驚いたことに、この問題は、JOIN FETCH (一方向の場合に機能します) を使用している場合でも、OpenJPA、EclipseLink、および Hibernate に存在します。
これを解決する良い方法はありますか?より複雑なグラフの N+1 選択問題を解決するソリューションはありますか?
編集: 私自身の研究の結果: - OpenJPA (私が使用している) の場合、解決策はまだわかりません - Hibernate @Fetch(FetchMode.SUBSELECT) の場合、問題は解決します。@BatchSize を使用することも役立ちます。これにより、指定された数の customer.orders フィールドが同時に選択されます。- EclipseLink の場合、同様の機能 @BatchFetch(value=BatchFetchType.IN) を見つけましたが、この場合は役に立ちません。双方向の関係でこれを効率的に処理できないと思います。