熱心なフェッチ
3772 ワード
熱心なフェッチは、初期の問い合わせで関連する実体を得るためにHibernateに伝えます.すべての実体が1つの質問だけでフェッチされるので、これは非常に効率的でありえます.しかし、ほとんどの場合、それはあなたのユースケースで必要としないエンティティを選択するので、巨大なオーバーヘッドを作成します.
ここでは、取得するタイプとして熱心ではないかもしれない例を示します.基本クラスは、イーベイ企業が複数のイーグルスプロダクトを持っていることを伝えます.デフォルトのfetchTypeは怠惰です.しかし、コーダーは、取得タイプを熱心に書きます.
熱心な製品協会は左結合を使用して検索された.すべての相対的な関連付けも同様にフェッチ.そのような関連付けのために、所有者実体テーブルはM回に加わります.
各々の余分の結合は、全体的な質問複雑さと実行時間に加えます.我々はすべてのこれらの関連を使用しない場合は、すべての可能なビジネスシナリオのために、我々はちょうど戻って何のために余分なパフォーマンスペナルティを支払っている.
長所遅れた初期化関連のパフォーマンス影響 短所長い最初の積載時間 あまりに多くの不必要なデータをロードするは、性能 に影響を及ぼすかもしれません
ここでは、取得するタイプとして熱心ではないかもしれない例を示します.基本クラスは、イーベイ企業が複数のイーグルスプロダクトを持っていることを伝えます.デフォルトの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回に加わります.
各々の余分の結合は、全体的な質問複雑さと実行時間に加えます.我々はすべてのこれらの関連を使用しない場合は、すべての可能なビジネスシナリオのために、我々はちょうど戻って何のために余分なパフォーマンスペナルティを支払っている.
合計する。
長所
Reference
この問題について(熱心なフェッチ), 我々は、より多くの情報をここで見つけました https://dev.to/yigi/hibernate-eager-fetching-36ndテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol