熱心なフェッチ


熱心なフェッチは、初期の問い合わせで関連する実体を得るためにHibernateに伝えます.すべての実体が1つの質問だけでフェッチされるので、これは非常に効率的でありえます.しかし、ほとんどの場合、それはあなたのユースケースで必要としないエンティティを選択するので、巨大なオーバーヘッドを作成します.
ここでは、取得するタイプとして熱心ではないかもしれない例を示します.基本クラスは、イーベイ企業が複数のイーグルスプロダクトを持っていることを伝えます.デフォルトのfetchTypeは怠惰です.しかし、コーダーは、取得タイプを熱心に書きます.
@Entity
@Table(name='companies')
public class EagerCompany { 
  @Id
  private int id;
  private String name;

  @OneToMany(fetch = FetchType.EAGER, mappedBy = 'company')
  private Set<EagerProducts> products = new HashSet<>();
}
バックグラウンドで実行しているものを観察するために、コーダは基本的な方法を実装しました.
@Transactional
public int countProductsByCompany(int id) {
  EagerCompany company = entityManager.find(EagerCompany.class, id);
  return company.getProducts().size();
}
Hibernateクエリの出力は以下の通りです.Hibernate:
select eagercompa0_.id as id1_0_0_,
eagercompa0_.name as name2_0_0_,
products1_.company_id as company_3_1_1_,
productsl_.id as id1_1_1_,
productsl_.id as id1_1_2_,
products1_.company_id as company_3_1_2_,
products1_.stock as stock2_1_2_
from
companies eagercompa0_
left outer join
products products1_
on
eagercompa0_.id = products1_.company_id
where
eagercompa0_.id=?

In eager loading strategy, if we load the Company data, it will also load up all Products associated with it and will store it in a memory.


熱心な製品協会は左結合を使用して検索された.すべての相対的な関連付けも同様にフェッチ.そのような関連付けのために、所有者実体テーブルはM回に加わります.
各々の余分の結合は、全体的な質問複雑さと実行時間に加えます.我々はすべてのこれらの関連を使用しない場合は、すべての可能なビジネスシナリオのために、我々はちょうど戻って何のために余分なパフォーマンスペナルティを支払っている.

合計する。


長所
  • 遅れた初期化関連のパフォーマンス影響
  • 短所
  • 長い最初の積載時間
  • あまりに多くの不必要なデータをロードする
  • は、性能
  • に影響を及ぼすかもしれません