乙個關於hibernate懶載入的問題

時間 2025-07-06 07:25:16

什麼是hibernate懶載入機制?

1樓:程式設計師殷保華

hibernate懶載入也叫延遲載入,是hibernate3關聯關係物件預設的載入方式,所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。簡單理解為,只有在使用的時候,才會發出sql語句進行查詢。 延遲載入機制是為了避免一些無謂的效能開銷而提出來的,在hibernate中提供了對實體物件的延遲載入以及對集合的延遲載入,另外在hibernate3中還提供了對屬性的延遲載入。

延遲載入是hibernate的一種機制,主要是解決不必要的查詢對資源的浪費,只有當資料真正呼叫時才載入,而不會對資料進行提前載入造成資源的浪費)。

load()方法就是延遲載入,延遲載入的有效期是在session開啟的情況下,當session關閉後,會報異常。當呼叫load方法載入物件時,返回**物件,等到真正用到物件的內容時才發出sql語句。

2樓:網友

lazy,翻譯成延遲載入更好,找到了資料但不是立刻載入到記憶體,而是在你真正使用的時候給你載入,get()方法就是立即載入,而load()方法是延遲載入。當session關閉後,延遲載入會失敗!

3樓:夢冷凝

用的時候才載入,不用不載入。

什麼是hibernate懶載入?什麼時候用懶載入?為什麼要用懶載入

4樓:匿名使用者

所謂懶載入(lazy)就是延時載入,延遲載入。

至於為什麼要用懶載入呢,就是當我們要訪問的資料量過大時,明顯用快取不太合適,因為記憶體容量有限 ,為了減少併發量,減少系統資源的消耗,我們讓資料在需要的時候才進行載入,這時我們就用到了懶載入。

比如部門entity和員工entity,部門與員工1對多,如果lazy設定為false,那麼只要載入了乙個部門的po,就會根據一對多配置的關係把所有員工的po也載入出來。但是實際上有時候只是需要用到部門的資訊,不需要用到 員工的資訊,這時員工po的載入就等於浪費資源。如果lazy設定為true,那麼只有當你訪問部門po的員工資訊時候才回去載入員工的po的資訊。

中lazy有三個值,true,false,proxy,預設的是lazy="proxy".

具體設定成什麼要看你的需求,並不是說哪個設定就是最好的。

假如在student物件中包含乙個head物件。

如果你確定在用student物件的時候就要用到head物件裡的屬性,那你就設定立即載入,因為設定立即載入那麼在查詢student的同時就會查詢student的head,hibernate就會在查詢的時候關聯兩張表從而生成的sql就可能只有一條。而如果你設定的是延遲載入,那麼肯定會要生成1+n條sql語句:其中「1」是查詢student的語句,「n」是根據n個student的id去查詢head的n條語句。

而且,延遲載入是要用到的 時候才去執行查詢,這樣系統判斷那裡需要載入,那裡不需要載入也需要時間,效能上肯定就不如立即載入了!

如果,你是有的地方需要用到student的時候才用到head屬性,那麼你就設定成延遲載入,因為查詢2張表的資料肯定要比查詢1張表的資料消耗大。

到低要怎樣設定就要看你的實際需求了。

延遲載入機制是為了避免一些無謂的效能開銷而提出來的,所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。在hibernate中提供了對實體物件的延遲載入以及對集合的延遲載入,另外在hibernate3中還提供了對屬性的延遲載入。

hibernate 懶載入和一級快取的關係。

5樓:pili飛飛

高階特性以及效能優化。

1)延遲載入 : 當程式執行getter方法獲取時,才傳送sql語句載入資料。

延遲載入給程式帶來好處,但是要避免session過早關閉問題a. load()和get()兩個方法區別load()採用延遲載入機制,返回的是乙個proxy**物件get()沒有采用延遲載入,返回的是乙個物件例項可以強制user物件例項化。

對映描述檔案中,等元素。

都可以使用lazy屬性,預設lazy="true",啟用延遲載入lazy="false"禁用延遲載入。

2)快取機制。

hibernate每次查詢先去快取中查詢,沒有才去資料庫查詢。

a.一級快取。

session級別的快取,快取load,get出來的單個物件。預設開啟。

使用同乙個session物件多次查詢同乙個user物件,只會傳送一次sql取資料庫獲取。

b.二級快取。

sessionfactory級別的快取。預設情況是關閉。

1)首先在中指定ehcache快取策略。

2)在src下新增配置檔案。

3)在中新增定義。

如果涉及更新,使用read-write

c.查詢快取。

快取hql查詢結果集,對相同的hql查詢語句,只去資料庫查詢一次。

6樓:網友

lazy load就是當第一需要用到資料的時候才去拿資料,才發sql,之前的sql在快取中儲存的。

session的快取是內建的,不可被解除安裝,是hiberante的第一級快取。

詳細的找本hibernate的書看看吧。東西很多,一時半會也說不清楚。

延遲載入又分為類級的和屬性級的,還要區分。

hibernate怎麼解決懶載入

7樓:網友

第一種:1.在需要禁用懶載入的對映檔案中顯示的加入lazy = "false"

這個方法大大的降低了程式的執行效率,如果訪問量小還是可以的。

第二種:2.在中配置。

opensessioninviewfilter

opensessioninviewfilter

這是乙個一勞永逸解決懶載入問題的辦法。使用spring的opensessioninviewfilter.

opensessioninviewfilter,改過濾器在view渲染時始終開啟session,一勞永逸解決hibernate的懶載入問題,該過濾器必須配置在struts2過濾器之前,如果訪問增大效能會降低不推薦使用(效能問題)

第三種:3.強行在service層面是初始化**物件。

就是在獲取物件之後,強行去載入物件中屬性集合(推薦)

例如:public department getdepartmentwithchildren(integer id){

department s = ;

強行初始化pages和questions集合。

for(student stu :

return s;

hibernate中的懶載入和急載入的區別

8樓:網友

懶載入: :在載入乙個實體的時候,不會馬上從資料庫中載入,即從資料庫中載入到記憶體。

急載入: :在載入乙個實體時,會立即從資料庫中查詢,與其關聯的類也會被同時查詢。

在我們使用@manytoone等時,都會被預設為急載入。

在hibernate中,我們無論是使用懶載入還是急載入,get方法都會一次載入所有基本資料型別屬性的值,而load則不同。

在我們開啟了懶載入之後,load方法只會載入id屬性,所有的非id屬性的訪問操作都不會執行。只有id屬性中有實際值(其實就是你呼叫load方法時傳的那個),在session沒有關閉的之前,如果訪問除id外的其他屬性才會發sql語句去查詢,我們經常犯的乙個錯誤就是在當前session關閉以後訪問由load()載入的物件的非id屬性,此時hibernate嘗試通過當前session發sql查詢,但發現session已經關閉,這樣就會發出no session的異常 。

一般我們將將 改成 eager ,就可以避免這個錯誤。

但是在我們需要查詢乙個表時,如果這個表有很多與其關聯的表,如果使用急載入的話,在第一次載入就會很慢,如果是懶載入相對則會快一些。但是在我們又需要查詢與此表相關的資料的時候。

急載入就會很快,因為在第一次載入的時候,已經幫我們全部載入好了。而懶載入則會相對慢一些,因為在我門需要查詢的時候,它才會幫我們去查。

所以讓他們算是各有優缺點。

而我們用哪一種方法更好,則需要根據我們的具體情況去使用了。

如何形容人懶,如何形容一個人懶

寶格格 好吃懶做 拼音 h o ch l n zu 解釋 好 喜歡 貪圖 懶 怠惰。指貪於吃喝,懶於做事。 呼延掣 坐享其成 享 享受 成 成果。自己不出力而享受別人取得的成果。坐吃山空 只坐著吃,山也要空。指光是消費而不從事生產,即使有堆積如山的財富,也要耗盡。遊手好閒 指人遊蕩懶散,不願參加勞動...

娶了懶老婆怎麼辦,娶了一個懶老婆怎麼辦?

充弘壯 你們還沒結婚的時候 她是不是就很懶啊?如果是這樣的話 我認為錯不在她 而是你對她的要求高了 相反,如果你們結婚了之後 使她變了個樣的話 建議離婚吧 她不同意的話,先分居兩年,自動離婚 這樣的人只有離婚,以後你們怎麼過日子呀,趁早離吧 這不是老婆是懶豬,趁早休了。 把自己變的勤奮些哈 看你能不...

我個好吃懶做的人,怎麼改掉,我是一個好吃懶做,遊手好閒,的人怎麼辦,怎麼才能改掉這些。。。求助

好煩的時候 將自己變得優秀,優秀是會上癮的,優秀了就不想變差了。首先把手機砸了,買個 手錶,老年機也行。手機是讓人懶惰的人根本原因,看你樣子自制力是極差的,如果你不砸你是沒救了。 詹用逮德海 每個人都不懶惰,每個人都想積極的生活。只是在沒有找到自己目標的時候我們會迷茫。有志之人立長志,無志之人常立志...