2016-03-23 99 views
0

我在採訪中被問到爲什麼hibernate @OneToOne和@ManyToOne使用Eager Loading和@OneToMany,@ManyToMany使用Lazy Loading?我向面試官解釋的是,因爲用戶可能對結果列表不感興趣,並且需要更多時間來加載,所以默認情況下它們被延遲加載。但面試官不滿意。任何人都可以清楚地指出爲什麼Hibernate社區讓他們如此?爲什麼hibernate @OneToOne和@ManyToOne使用Eager Loading,@OneToMany和@ManyToMany使用Lazy Loading?

+1

因爲這就是JPA規範所說的應該做的。 AFAIK,如果Hibernate有選擇的話,默認情況下它會使一切都變得懶惰。 –

+0

可以有很多孩子(家庭可以增加),但只有一個家長。 –

回答

1

在任何@*ToOne關係中,目標方明確可以假定爲屬於作爲邏輯部分來源。所以可以預料,如果目標對象正在被訪問,它只會發生在源對象上。而且這也會發生。

對於@*ToMany,很難先知道需要哪個目標對象,或者程序在加載關係的源端時是否需要所有相關對象。在這種情況下,盲目加載相關對象會浪費資源。

此默認設置將確保在大多數情況下,可能要訪問的對象存在於內存中,同時避免一次加載整組實例。

導致啓發式檢測的基本問題是:
什麼相關的對象將被定義,並且可以有效地提供這些對象。

如果缺省值在給定數據模型中的某個點上不合適,則可以適當地更改延遲加載的設置。