私はプロジェクトのリストと顧客のリストを持っています。プロジェクトは1人の顧客のためのものであり、すべての顧客は多くのプロジェクトを持つことができます。したがって、プロジェクトが所有側であるシンプルな1:nの関係です。不可欠に簡素化された これはN + 1の問題ですか?どのように修正するのですか?
それは私がプロジェクトのリストをロードすると、私は同じ時間で効率的に顧客を取得したい@Entity
public class Project {
@Id
long id;
@ManyToOne(optional = true)
@JoinColumn(name = "customer", nullable = true, updatable = true)
Customer customer;
}
@Entity
public class Customer {
@Id
long id;
}
です。これはそうではありません。プロジェクトのための1つのクエリがあり、それから別個のクエリが発行されるすべての個別の顧客のためです。
だから私は50の異なる顧客に割り当てられている100のプロジェクトがあると言います。これにより、プロジェクトのクエリーが1つ、顧客のクエリーが50件になります。
これはすぐに大きなプロジェクト/顧客リストを追加し、私たちのアプリケーションはかなり遅くなります。これは単なる一例です。関係を持つすべてのエンティティは、この動作の影響を受けます。
示唆したように、私はすでにherecustomers
フィールド上@Fetch(FetchMode.JOIN)
を試みたが、それは何もしてFetchMode.SUBQUERY
しませんが休止状態に応じて適用されない:
org.hibernate.AnnotationException:FetchMode.SUBSELECTの使用はトゥーン団体に許可されていません
この問題を解決するにはどうすればよいですか?
私はそれはN + 1問題だとは思わない、デフォルトのフェッチ・タイプあなたのために'@ ManyToOne'の関係はすでに' FetchType.EAGER'です –