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有關on
Hibernate3在關聯上有l(wèi)azy這個屬性,如果是Hibernate2,應該是設置outer-join="false",然后被關聯的對象,在class那個地方設置lazy="true".首先,對于many-to-on
對于on
總體來說,如果你發(fā)現你查詢兒子的時候,有多余的sql發(fā)送,那一定是你對hibernate的誤用..
在hibernate 的on
Hibernate中的對象的關聯(association)的設置還是不夠靈活,實際應用中有的地方需要lazy load,有的地方又不需要,其實還有的地方就根本不需要使用association。而在Hibernate中,只能在影射文件中設置一種方式,像我們這樣的應用,我是不敢輕易使用open session in view的(慢點總比lock住要好),只能是要么不設置association,要么就是lazy=true的。以前的分類信息只用了一個many to on