2013-03-19 78 views
2

我在學習Hibernate,我通過hibernate lazy initialization來到。我有幾個關於的說明lazy initialization.在休眠中進行懶化初始化

首先,什麼是所謂的惰性初始化,它做什麼?其次,我應該什麼時候去做它?接下來,我在博客中發現,使用它可以提高性能,我只需要知道如何。那麼,有沒有使用它的缺點?任何人都可以幫我理解這個lazy initialization

回答

6

提取(或初始化)與渴望相反。 Lazy fetching(hibernate中的默認值)意味着從數據庫加載記錄時,不會加載一對多關係子行。例如。

@Entity 
@Table(name = "COMPANY") 
public class Company { 
... 
@OneToMany(fetch = FetchType.LAZY) 
private Set<Employee> employees = new HashSet<Employee>(); 

請求公司記錄不會返回(設置)員工,他們必須在另一個查詢中被請求。

優勢

  • 性能。員工只在需要(和要求)時加載。受益於CPU,內存,帶寬...(包括Java端和SQL服務器端)。

缺點

  • 時也需要僱員,分離查詢必須被執行。同一會議期間進行

注意對員工查詢有(或著名LazyInitializationException中將是不受歡迎的)。

This page保存有趣的信息。

3

延遲初始化意味着延遲加載。

在極少數words-

初始化的對象時,你首先需要它,它給你的不必要的對象不加載高性能。」

EG-假設你需要有一個包含多個表的連接的記錄,如果一次獲取,則需要比只讀取主表的時間更長的時間,使用延遲加載時,只有在需要時纔會獲取其餘的信息。所以在某些情況下實際上是efficient-loading

2

延遲設置決定是否在加載父對象時加載子對象。您需要執行此操作來設置父類的各自的Hibernate映射文件。 Lazy = true(意思是不加載孩子)默認情況下,子對象的延遲加載是真實的。這可確保子對象不會被加載,除非通過在父應用程序上調用getChild()方法在應用程序中明確調用它們。在這種情況下,在Parent對象上實際調用getChild()時,hibernate發出新的數據庫調用來加載子進程。但是在某些情況下,當加載父對象時,您確實需要加載子對象。只需製作lazy=false,當從數據庫加載父項時,hibernate將加載子項。示例lazy=true(默認)如果不需要頻繁使用User類,則可以將用戶類的地址子項設置爲惰性。 lazy=false但是,當您處理在線書店的書籍時,您可能需要爲書籍父母加載作者對象。