国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Hibernate lazy屬性 - 江東孫策的日志 - 網易博客
userphoto

2010.10.30

關注

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。但是在我們的系統(tǒng)中,session是被立即關閉的,也就是在讀取了name,password,phone等基本屬性后,session已經close了,再進行l(wèi)azy loaiding就會有異常。

解決辦法是在close session之前,調用Hibernate.initialize(user.getPosts()),告訴系統(tǒng),user.getPosts()是需要lazy laoding的。但是這樣做會破壞HibernateSession類的封裝.

后來采用所謂的OpenSessionInView模式,把session的周期交給servlet filter來管理,每當有request進來,就打開一個session,response結束之后再關閉它,這樣可以讓session存在于整個請求周期中。

Hibernate中Lazy延遲加載

Hibernate有關one-to-one和many-to-one在查詢中的父親端lazy問題

Hibernate3在關聯上有l(wèi)azy這個屬性,如果是Hibernate2,應該是設置outer-join="false",然后被關聯的對象,在class那個地方設置lazy="true".首先,對于many-to-one的問題,可以在父親端的class標簽中設置lazy來解決,這樣,在查詢兒子的時候,不會發(fā)送多余的sql .

對于one-to-one,在hibernate2里面,由于one-to-one里面沒有l(wèi)azy的選項,所以只能通過設置outer-join="false"來解決。而hibernate3已經加入了lazy,所以不會有這個問題。

總體來說,如果你發(fā)現你查詢兒子的時候,有多余的sql發(fā)送,那一定是你對hibernate的誤用..

在hibernate 的one-to-many,many-to-one,many-to-many中,為了效率的提高,我們一般都采用lazy機制,但使用spring的getHibernateTemplate().save(Object)時,HibernateTemplate試圖每次在execute之前去獲得Session,執(zhí)行完就力爭關閉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,對帶寬的浪費也還是不可原諒的。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Hibernate中get()與load()的區(qū)別
Hibernate中get方法和load方法的區(qū)別
Hibernate之lazy延遲加載(轉)
hibernate--lazy(懶加載)屬性
分享:hibernate中l(wèi)oad和get方法的區(qū)別
Hibernate 筆記5 load和get方法的區(qū)別
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服