所謂延時(shí)加載就是懶加載(lazy),延遲加載。
什么時(shí)候用懶加載呢,我只能回答要用懶加載的時(shí)候就用懶加載。
至于為什么要用懶加載呢,就是當(dāng)我們要訪問(wèn)的數(shù)據(jù)量過(guò)大時(shí),明顯用緩存不太合適,因?yàn)閮?nèi)存容量有限 ,為了減少并發(fā)量,減少系統(tǒng)資源的消耗,
我們讓數(shù)據(jù)在需要的時(shí)候才進(jìn)行加載,這時(shí)我們就用到了懶加載。懶加載的異常有很多種,你指的是不是session已經(jīng)關(guān)閉的異常?因?yàn)槟莻€(gè)初學(xué)者最容易遇到情況是當(dāng)你加載出一個(gè)一對(duì)多關(guān)系的一這端的對(duì)象,然后在出了事務(wù)之后的地方,比如頁(yè)面上,還想再獲取多端對(duì)象里面的除了id以外的屬性的時(shí)候,就會(huì)跑出這個(gè)異常。
我舉個(gè)例子,你有一個(gè) Grade 對(duì)象關(guān)聯(lián)了 很多 Student 對(duì)象,并且用的是懶加載
你在service里面通過(guò)數(shù)據(jù)庫(kù)查詢獲得了一個(gè) Grade對(duì)象,這個(gè)對(duì)象里面有一個(gè)Set<Student> students 集合,但是你并沒(méi)有對(duì)這個(gè)對(duì)象做進(jìn)一步的處理(比如 intialize之類(lèi)的操作讓?xiě)屑虞d的代理對(duì)象真正去實(shí)例化)
然后你到了頁(yè)面的展示的時(shí)候,去遍歷 students 這個(gè)集合,并且你試圖在頁(yè)面上顯示每個(gè) student 的 name 屬性(這個(gè)屬性不是studentId) 這個(gè)時(shí)候就會(huì)拋出session已經(jīng)關(guān)閉的異常
在SSH框架中:
可直接可以使用OpenSessionInViewFilter
在配置文件中配置
<filter-name>opensession</filter-name>
<filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<filter-mapping>
<filter-name>opensession</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
以上就是本文的全部?jī)?nèi)容了,希望小伙伴們能夠喜歡。