懶加載: FatchType.LAZY :在加載一個實體的時候,不會馬上從數據庫中加載,即從數據庫中加載到內存。
急加載:FatceType.EAGER :在加載一個實體時,會立即從數據庫中查詢,與其關聯的類也會被同時查詢。
在我們使用@ManyToOne等時,都會被默認為急加載。
在hibernate中,我們無論是使用懶加載還是急加載,get方法都會一次加載所有基本數據類型屬性的值,而load則不同。
在我們開啟了懶加載之后,load方法只會加載id屬性,所有的非id屬性的訪問操作都不會執行。只有id屬性中有實際值(其實就是你調用load方法時傳的那個),
在session沒有關閉的之前,如果訪問除id外的其他屬性才會發sql語句去查詢,我們經常犯的一個錯誤就是在當前session關閉以后訪問由load()加載的對象的非id屬性,
此時Hibernate嘗試通過當前session發sql查詢,但發現session已經關閉,這樣就會發出no session的異常 。
一般我們將將FetchType.lazy 改成 EAGER ,就可以避免這個錯誤。
但是在我們需要查詢一個表時,如果這個表有很多與其關聯的表,如果使用急加載的話,在第一次加載就會很慢,如果是懶加載相對則會快一些。但是在我們又需要查詢與此表相關的數據的時候
急加載就會很快,因為在第一次加載的時候,已經幫我們全部加載好了。而懶加載則會相對慢一些,因為在我門需要查詢的時候,它才會幫我們去查。
所以讓他們算是各有優缺點。
而我們用哪一種方法更好,則需要根據我們的具體情況去使用了
