關於解決懶加載的問題
今天被一個懶加載問題困擾了近八個鐘頭,現在將這些新的總結下,剛開始我使用的是struts2-Json的方式不讓,目標列序列化,代碼如下:
@JSON(serialize = false) public Set<FixedArea> getFixedAreas() { return fixedAreas; }
但是這種方法在我這並不是太如意,時靈時不靈.對了不要有那個小夥伴去嘗試把serialize換成,desrialize=true來代替,效果是一樣的.然後我又換成了使用web.xml文件中配置openSessionInViewFilter,雖然這太粗暴,但當時我不甘心就試了試,結果配置後整個項目都訪問不了,配置代碼如下:
1 <filter> 2 <filter-name> 3 OpenSessionInViewFilter 4 </filter-name> 5 <filter-class> 6 org.springframework.orm.hibernate5.support.OpenSessionInViewFilter 7 </filter-class> 8 </filter> 9<filter-mapping> 10 <filter-name>OpenSessionInViewFilter</filter-name> 11 <url-pattern>/*</url-pattern> 12 </filter-mapping>
最後,無奈還是用了數據表關聯,中的迫切加載來解決問題:
這裏就要先聊一聊表與表之間的關系:一對一/多對一;一對多;多對多;
由於我這裏是多對多的表結構,那就說多對多,直接先上代碼:
@ManyToMany(mappedBy = "couriers",fetch=FetchType.EAGER)
private Set<FixedArea> fixedAreas = new HashSet<FixedArea>();
我標紅的部分就是起作用的不.對了,我先說一下為甚麽沒有直接使用fetch方式,因為我在查詢的時候是用不到區域的信息的.所以就想使用@Json(serialize=false)來讓我不需要的列不去序列化(而且我關聯表裏還沒有數據),這列數據就不會被加載那也就自然而然的解決的懶加載的問題,但事情並不是我想像的那樣.@Json(serialize=false)僅僅是讓這列數據不被序列化,並不能防止懶加載的問題.解決問題後,我做了實驗.只有.@Json(serialize=false)項目會報懶加載的錯誤。配置fetch=FetchType.EAGER之後項目是不會出懶加載的錯了,但由於關聯表中並沒有數據,所以迫切加載的結果就是空。而在時候@Json(serialize=false)起作用了。在獲得的數據中是沒用fixedAreas這列的數據。也就是說fetch=FetchType.EAGER他解決的是懶加載而不是讓數據不加載,而@Json(serialize=false)的作用就是讓數據加載時跳過fixedAreas達到fixedAreas不加載。
最終我的猜想就是:最開始只加了@Json(serialize=false),對象在向前臺返回數據是是會加載的,加載後會根據配置的 @Json(serialize=false)來跳過不被序列化的列。由於沒有配置fetch=FetchType.EAGER造成了在action是事務已經關閉,這是在去加載自然匯報懶加載的問題。而當我配置過fetch=FetchType.EAGER就會是他直接加載但得到的數據為空,而@Json(serialize=false)的作用是跳過該列所以就完美的完成了既不要無用數據也解決了懶加載的問題。
註:我的猜想只是針對我這臺電腦上的jvm來說的,因為別人的電腦就配置了一個@Json(serialize=false)就完美的解決了因為不想得到的數據而引起的懶加載問題,試了好幾個,就我的電腦在只配置@Json(serialize=false)是出現是不是報出懶加載的問題。
關於解決懶加載的問題