JPAのフェッチ戦略は正確に何を制御しますか? 熱心と怠惰の違いを検出できません。どちらの場合も、JPA/Hibernate は自動的に多対 1 の関係に参加しません。
例: 個人の住所は 1 つです。アドレスは多くの人に属することができます。JPA アノテーション付きエンティティ クラスは次のようになります。
@Entity
public class Person {
@Id
public Integer id;
public String name;
@ManyToOne(fetch=FetchType.LAZY or EAGER)
public Address address;
}
@Entity
public class Address {
@Id
public Integer id;
public String name;
}
JPA クエリを使用する場合:
select p from Person p where ...
JPA/Hibernate は、Person テーブルから選択する 1 つの SQL クエリを生成し、次に各人物の個別のアドレス クエリを生成します。
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
これは、大きな結果セットでは非常に悪いことです。1000 人がいる場合、1001 個のクエリが生成されます (1 つは Person から、1000 は Address とは異なります)。これは、MySQL のクエリ ログを見ているのでわかります。アドレスのフェッチ タイプを熱心に設定すると、JPA/Hibernate が結合で自動的にクエリを実行することを理解していました。ただし、フェッチ タイプに関係なく、リレーションシップに対して個別のクエリが生成されます。
明示的に参加するように指示した場合にのみ、実際に参加します。
select p, a from Person p left join p.address a where ...
ここで何か不足していますか?多対 1 の関係を結合したままにするために、すべてのクエリを手作業でコーディングする必要があります。MySQL で Hibernate の JPA 実装を使用しています。
編集: JPAクエリに影響を与えないようです(Hibernate FAQ hereおよびhereを参照) 。FetchType
したがって、私の場合、参加するように明示的に指示しました。