簡體   English   中英

FetchType.LAZY是否獲取列表中的任何內容或該內容為空

[英]Does FetchType.LAZY fetch anything in list or it's empty

假設我有一個關聯,

class Department{

......

@OneToMany(fetch = FetchType.LAZY)
private List<Employee> employees; 

}

現在,當我提取Department ,它將提取employees list所有內容,還是將其完全清空。

將員工對象的標識符加載到列表中,例如說我具有以下員工對象屬性:

Employee{
id
name
doj
....

}

Lazy object like {
id -> 111
name -> null
doj -> null

}

現在,當我初始化員工對象或使用getter訪問它的屬性時,該對象將使用id作為標識符從數據庫加載... ??

代替實際的收集類(例如ArrayList ),將不同的List實現注入到您的字段( PersistentList )中。 根據該集合的調用和惰性策略,它將執行不同的操作:

  • 如果lazy="lazy"調用任何collections方法將使該collection完全加載
  • 如果lazy="extra" ,則對某些函數的調用將觸發SQL而不會加載該集合。 例如list.size()將觸發select count... 在獲取第一個元素時,只會選擇該元素。 這可能適用於大型收藏。 請注意,此行為也可能取決於集合類型-無序集合將始終加載所有元素。

延遲獲取類型,Hibernate不會加載該特定對象實例的關系。

FetchType.LAZY =除非通過getter明確“要求”,否則不會加載關系FetchType.EAGER =加載所有關系

在您的情況下,除非您明確觸發查詢,否則它將不會從數據庫加載員工列表,因為您已經設置了提取類型(fetch = FetchType.LAZY)。 如果獲取類型為(fetch = FetchType.EAGER),則它將顯式觸發Employee列表的選擇查詢。 在該對象中,您將獲得所有員工屬性,例如姓名,司法部。

該對象將使用id作為標識符從數據庫加載... ??

Department{
    @OneToMany(fetch = FetchType.EAGER,,mappedBy = "department")
    private List<Employee> employees; 
}

在Emplooyee中。...您需要通過引用部門對象將其映射。 例如:

Employee{

    // Reference of department.

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "departmentid", nullable = false)
    private Department department;  
}

這樣它將變成雙向的。 現在,Hibernate將通過引用觸發查詢(本機sql中的id)。

如果要延遲加載,請在兩個映射中設置Fetch模式FetchType.LAZY。

就您而言,直到您(通過getter或任何其他方式)顯式訪問Department.employees為止,它將不會加載Employee實體。 為此將有一個代理。 它將在第一次調用此employees集合時被初始化一次。

延遲加載在Hibernate中的工作方式

Hibernate可以將延遲加載行為應用於您的實體和關聯的最簡單方法是通過提供它們的代理實現。 Hibernate通過替換從實體類派生的代理來攔截對實體的調用。 如果缺少所請求的信息,則在將控制權移交給父實體的實現之前,將從數據庫中加載該信息。

請注意,當關聯表示為集合類時,將創建包裝器(本質上是集合的代理,而不是集合所包含的實體),並替換為原始集合。 當您訪問此集合代理時,您在返回的代理集合中得到的不是代理實體;而是 而是它們是實際的實體。 您無需在理解此概念上施加太大壓力,因為在運行時幾乎沒有關系。

請參閱此以獲取更多信息: http : //howtodoinjava.com/hibernate/lazy-loading-in-hibernate/

還要啟用hibernate.sql.show=true以便在嘗試獲取集合時可以看到正在觸發哪些查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM