關於Hibernate性能優化之 FetchType=Lazy時查詢數據


當表A和表B一對多的關系

對於A和B的實體類,設置FetchType=EAGER時,取A表數據,對應B表的數據都會跟着一起加載,優點不用進行二次查詢。缺點是嚴重影響數據查詢的訪問時間。

解決辦法FetchType=LAZY,此時查詢的訪問時間大大縮短,缺點是查詢表A 的數據時,訪問不到表B的數據。

解決辦法嘗試一,在web.xml中加入下面配置,表示在頁面中關閉session

<!-- 把session的關閉延遲到jsp頁面顯示之后,在配在struts2上面。-->
    <filter>
        <filter-name>OpenSessionInView</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>OpenSessionInView</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
出現的問題是:新增加一條記錄回到列表頁面,對應的B表數據還是沒有。
解決辦法嘗試二:
在session未關閉前循環List,顯示調用,舉例如下
for(B b:bList){
    b.getA();
}
出現問題:如果debug模式,可以獲得A信息,如果tomcat正常運行模式,還是取不到A。沒有具體研究是不是因為我們實在ManyToOne多的端取一端。
解決辦法三:此辦法可以應用
for(B b:bList){
   Hibernate.initialize( b.getA());
}
解決辦法四:此辦法也可以應用
在session關閉后,我可以循環
for(B b:bList){
   int aId = b.getA().getId();
  A a =  findAById(aId);
  b.setA(a);
}

來源:https://blog.csdn.net/janefir/article/details/19555803


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM