国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

淺談解決Hibernate懶加載的4種方式

2024-07-13 10:15:16
字體:
來源:轉載
供稿:網友

本文總結了我在學習hibernate的過程中,解決hibernate懶加載問題的四種方式。

所謂懶加載(lazy)就是延時加載,延遲加載。

什么時候用懶加載呢,我只能回答要用懶加載的時候就用懶加載。

至于為什么要用懶加載呢,就是當我們要訪問的數據量過大時,明顯用緩存不太合適,因為內存容量有限,為了減少并發量,減少系統資源的消耗,我們讓數據在需要的時候才進行加載,這時我們就用到了懶加載。

例如,有一個對象是Employee,還有一個對象是Department。顯然,對于Employee相對Department來說,是多對一的關系;而對于Department相對Employee來說,是一對多的關系。當我們查詢Employee對象的時候,如果希望通過employee對象的屬性department查詢到所對應的Department,那么是會拋出異常的。這是因為懶加載的存在,在session關閉之后,hibernate又向數據庫發出一次請求,結果就拋出異常了。

下面總結的是解決這個問題的四種方式:

1.顯式初始化(在查詢方法內部)

要查詢某員工屬于哪個部門的時候,需要對Department進行預先查詢

使用語句

Hibernate.initialize(Department.class); 

hibernate,懶加載,hibernate的懶加載,關閉懶加載,取消懶加載

2.修改對象關系文件,將lazy改寫lazy=false,即關閉懶加載

以上兩種方法,確實可以解決問題,但是缺點是無論后面是否使用該對象,hibernate都會向數據庫發出SQL語句請求數據,造成不必要的性能浪費。

3.使用過濾器(web項目)

①獲取session的方式必須使用getCurrentSession

②特殊的關閉session方式

public void doFilter(ServletRequest request, ServletResponse response,    FilterChain arg2) throws IOException, ServletException {   // TODO Auto-generated method stub   Session session = null;   Transaction tx = null;   try {    session = HibernateUtil.getCurrentSession();    tx = session.beginTransaction();    arg2.doFilter(request, response);//請求一直在走    tx.commit();   } catch (Exception e) {    // TODO: handle exception    if(tx != null){     tx.rollback();    }   }finally{    //特殊的關閉方式    HibernateUtil.closeCurrentSession();   }  } 

4.在SSH框架中,使用spring提供的openSessionView

其原理和第三種方法中使用Filter類似,只不過這個filter是spring提供的。使用時只需要在web.xml文件配置如下:

<!-- 使用spring解決懶加載問題 -->  <filter>   <filter-name>OpenSessionInViewFilter</filter-name>   <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  </filter>  <filter-mapping>   <filter-name>OpenSessionInViewFilter</filter-name>   <url-pattern>/*</url-pattern>  </filter-mapping> 

第3和第4中方法也能解決懶加載的問題,其中第4種方法也是目前使用較多的。但是這兩種方法也是有缺點的,缺點就是延長了session關閉的時間,session的生命周期變長。沒有使用該方法之前,session是在查詢完數據之后,就被關閉了;而現在,session的關閉是在一次web請求的最后才關閉。

總結

以上就是本文關于淺談解決Hibernate懶加載的4種方式的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 杭州市| 泸定县| 鲁甸县| 紫阳县| 日照市| 波密县| 阜新| 冷水江市| 格尔木市| 石狮市| 休宁县| 邹城市| 凤冈县| 台北县| 隆子县| 晋州市| 耿马| 黄陵县| 乌兰察布市| 林甸县| 太仓市| 兰坪| 县级市| 灵山县| 闻喜县| 安阳市| 镇赉县| 巴东县| 潮州市| 台中市| 万全县| 本溪市| 呼伦贝尔市| 临邑县| 余姚市| 中山市| 定结县| 乌海市| 平安县| 吉林省| 吉林省|