2017-01-04 28 views
0

比方說,我有一個關聯作爲,是否FetchType.LAZY獲取列表中的任何東西,或它是空

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 

} 

現在,當我初始化Employee對象或訪問它的使用干將性質,那麼對象將被載入從數據庫使用ID作爲標識符...?

+0

你可以嘗試一下,看看。 –

回答

0

在你的情況,直到明確地訪問Department.employees(通過getter或任何其他方式)它不會加載Employee實體。將有一個代理這個。它將在第一次調用時初始化一次以訪問此employees集合。

+0

它將保存主鍵或任何標識符。 –

0

如何延遲加載,爲他們提供的代理實現在休眠

話Hibernate就可以在你的實體和關聯應用延遲加載行爲的最簡單方法是作品。 Hibernate通過用一個代理來替代實體類的派生代碼,從而攔截對實體的調用。在缺少請求的信息的情況下,在將控制權交給父實體實施之前,它將從數據庫中加載。

請注意,當該協會表示爲一個集合類,然後創建一個包裝(本質上是集合了代理,而不是它包含的實體),並取代了原來的集合。當你訪問這個集合代理時,你得到的內部返回的代理集合不是代理實體;而是他們是實際的實體。你不需要在理解這個概念上施加太大的壓力,因爲在運行時它幾乎不重要。

請有關更多信息,請參閱本: http://howtodoinjava.com/hibernate/lazy-loading-in-hibernate/

也使hibernate.sql.show=true,使你可以看到,當你試圖獲取集合被解僱哪些查詢。

2

取代真正的集合類(例如ArrayList),將不同的List實現注入到您的字段(PersistentList)中。根據對收集和懶惰戰略的呼籲會做不同的事情:

  • 如果lazy="lazy"調用任何的集合方法會得到滿載
  • 如果lazy="extra",然後調用一些集合函數會在不加載集合的情況下觸發SQL。例如。 list.size()會觸發select count...。獲取第一個元素只會選擇該元素。這可能適合大型館藏。請注意,這種行爲也可能依賴於集合類型 - 無序集合無論如何都會加載的所有元素。
1

惰性提取類型,Hibernate不會加載該特定對象實例的關係。

FetchType.LAZY =不通過干將 FetchType.EAGER =負載的所有關係

在你的情況下,它不會從數據庫加載員工列表,除非你明確地火查詢其載入「要求」,除非明確的關係,因爲您已設置獲取類型(fetch = FetchType.LAZY)。如果獲取類型是(fetch = FetchType.EAGER),那麼它將顯式激發一個Employee列表的選擇查詢。在那個對象中,你會得到所有員工的財產,例如name,doj。

該對象將從數據庫加載使用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)觸發查詢。

如果你想懶洋洋地設定裝入兩個映射提取模式FetchType.LAZY ....

+0

* FetchType.LAZY =除非通過** getters明確「詢問」否則不加載關係***:我相信這是錯誤的。無論何時訪問列表(通過其大部分方法),都會觸發延遲加載。它與「getters」無關 –

+0

而且,你不需要將它映射爲渴望雙向關係 –

+0

是的,我同意我只是舉了一個例子,如果你想急於加載,那麼你需要寫例如:@OneToMany (fetch = FetchType.EAGER ,, mappedBy =「department」)。否則它將不加載任何內容。你的設置將是空的。 – Gokul

相關問題