2014-09-13 63 views

回答

23

比方說,我們有實體是這樣的:

@Entity 
@Table 
public class Parent { 
    @Id 
    private Long id; 

    @OneToMany(mappedBy="parent", fetch = FetchType.EAGER) 
    @Fetch(FetchMode.JOIN) 
    private List<Child> child;  
    //getter setters 
} 


@Entity 
@Table 
public class Child {  
    @Id 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    private Parent parent; 

    //getter setter 
} 

在上面的例子中,得到Parent實體時,Hibernate會全自動加載所有child實體急切地使用連接。另一方面,當您獲取Child時,Parent實體將不會被選中,除非您在代碼child.getParent()中將其稱爲明確。

FetchType(Lazy/Eager)告訴我們是否希望實體在代碼中調用時急切或懶惰地加載。

FetchMode(Select/Join)告訴我們是否希望我們的實體被加載額外的選擇,或者通過join或subselect在一個查詢中加載。

+0

在線找到。很有幫助。 http://www.solidsyntax.be/2013/10/17/fetching-collections-hibernate/ – Jake 2016-02-07 00:40:46

18

FetchMode:它定義how休眠(使用該策略,例如加入,子查詢等)將從數據庫獲取數據。

FetchType:它定義whether休眠將獲取的數據或沒有。

備註FetchMode只適用於FetchType = EAGER註解。

+8

FetchMode不僅適用於FetchType.EAGER。規則如下:a)如果不指定FetchMode,則缺省值爲JOIN且FetchType工作正常; b)如果明確指定FetchMode.JOIN,則忽略FetchType並且查詢始終處於激活狀態; c)如果指定FetchMode.SELECT或FetchMode.SUBSELECT,FetchType.Type工作正常。 – 2016-12-28 11:16:35

+0

@DawidStępień這個信息非常有幫助! – GMsoF 2017-11-01 05:06:43

相關問題