hibernate lazy加载
2019獨角獸企業重金招聘Python工程師標準>>>
HIBERNATE的持久化對象加載策略。
延遲加載, 也就是用到的時候才去加載.這樣可以提高一些性能.
Hibernate的lazy loading 采用了一個HibernateSession來管理session,它的邏輯是每進行一次數據庫操作,就開新的session,操作完成后立即關閉該session。這樣做的好處是可以嚴格關閉session,避免菜鳥級的錯誤,但是hibernate.org并不推薦這么做。因為這不適合lazy loading,也不適合跨方法的事務。
比如在我們的應用中,user->post形成一對多的映射,User中有一個包含post的List。
在User中,有多個屬性:name,password,phone等,還有一個List類型的posts。當我們對posts使用lazy laoding的時候,hibernate會在獲得User對象的時候,僅僅返回name,password,phone等基本屬性,當你訪問posts的時候,它才會從數據庫中提取posts需要的數據,這就是所謂lazy laoding。但是在我們的系統中,session是被立即關閉的,也就是在讀取了name,password,phone等基本屬性后,session已經close了,再進行lazy loaiding就會有異常。
解決辦法是在close session之前,調用Hibernate.initialize(user.getPosts()),告訴系統,user.getPosts()是需要lazy laoding的。但是這樣做會破壞HibernateSession類的封裝.
后來采用所謂的OpenSessionInView模式,把session的周期交給servlet filter來管理,每當有request進來,就打開一個session,response結束之后再關閉它,這樣可以讓session存在于整個請求周期中。
Hibernate中Lazy延遲加載
Hibernate有關one-to-one和many-to-one在查詢中的父親端lazy問題
Hibernate3在關聯上有lazy這個屬性,如果是Hibernate2,應該是設置outer-join="false",然后被關聯的對象,在class那個地方設置lazy="true".首先,對于many-to-one的問題,可以在父親端的class標簽中設置lazy來解決,這樣,在查詢兒子的時候,不會發送多余的sql .
對于one-to-one,在hibernate2里面,由于one-to-one里面沒有lazy的選項,所以只能通過設置outer-join="false"來解決。而hibernate3已經加入了lazy,所以不會有這個問題。
總體來說,如果你發現你查詢兒子的時候,有多余的sql發送,那一定是你對hibernate的誤用..
在hibernate 的one-to-many,many-to-one,many-to-many中,為了效率的提高,我們一般都采用lazy機制,但使用spring的getHibernateTemplate().save(Object)時,HibernateTemplate試圖每次在execute之前去獲得Session,執行完就力爭關閉Session 。也就是說Hibernate的Lazy初始化1:n關系時,你必須保證是在同一個Session內部使用這個關系集合,不然Hiernate將拋出Failed to lazily initialize a collection - no session or session was closed的例外。
Hibernate中的對象的關聯(association)的設置還是不夠靈活,實際應用中有的地方需要lazy load,有的地方又不需要,其實還有的地方就根本不需要使用association。而在Hibernate中,只能在影射文件中設置一種方式,像我們這樣的應用,我是不敢輕易使用open session in view的(慢點總比lock住要好),只能是要么不設置association,要么就是lazy=true的。以前的分類信息只用了一個many to one的關系,代價還可以忍受,但現在關系越來越復雜了,再多加幾個的話,所要付出的performance,帶寬等方面的代價恐怕就不能忽略了,即使使用cache提高一點performance,對帶寬的浪費也還是不可原諒的。
轉載于:https://my.oschina.net/91jason/blog/304055
總結
以上是生活随笔為你收集整理的hibernate lazy加载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RTMPdump(libRTMP) 源代
- 下一篇: 关于伪静态网站的好处