hibernate消極式載入

來源:互聯網
上載者:User

標籤:nsa   ber   title   載入   table   實體類   tostring   帶來   log   

本節內容:

  • l  掌握延遲策略概念
  • l  掌握實體物件的消極式載入
  • l  掌握集合類型的消極式載入
  • l  瞭解屬性消極式載入

1  延遲策略概念

  •  消極式載入機制是為了避免一些無謂的效能開銷而提出來的,所謂消極式載入就是當在真正需要資料的時候,才真正執行資料載入操作。
  • 在Hibernate中提供了對實體物件的消極式載入以及對集合的消極式載入,另外在Hibernate3中還提供了對屬性的消極式載入。
  • Hibernate中的消極式載入策略只有在session開啟的狀態下有效。

2  實體物件消極式載入

如果想對實體物件使用消極式載入,必須要在實體的映射設定檔中進行相應的配置,如下所示:

<!-- class的lazy屬性設為true,則為實體的消極式載入 -->    <class name="com.silvan.pojo.News" table="news" lazy="true">        <id name="id">            <generator class="native"></generator>        </id>        <property name="title" />        <property name="content" />    </class>

插入資料後使用下面代碼進行查詢測試:

public void query(){        Session session = HibernateUtil.getSession();        Transaction tx = null;        try{            tx = session.beginTransaction();            News news=(News)session.load(News.class,21);//(1)            System.out.println(news.getTitle());//(2)        }catch(Exception e){            if(tx!=null){                tx.rollback();            }            e.printStackTrace();        }finally{            HibernateUtil.closeSession(session);        }    }

解析:

  •  當運行到(1)處時,Hibernate並沒有發起對資料的查詢,如果我們此時通過一些調試工具,觀察此時news對象的記憶體快照,我們會驚奇的發現,此時返回實體物件的代理類對象,這裡所返回的物件類型就是News對象的代理類對象。
  •  當代碼運行到(2)處時,此時調用news.getTitle() 方法,發出Sql語句進行查詢。
  •  這樣,通過一個中間代理對象,Hibernate實現了實體的消極式載入,只有當使用者真正發起獲得實體物件屬性的動作時,才真正會發起資料庫查詢操作。所以實體的消極式載入是用通過中間代理類完成的,所以只有session.load()方法才會利用實體消極式載入,因為只有session.load()方法才會返回實體類的代理類對象。

3 集合類型的消極式載入

  • 在Hibernate的消極式載入機制中,針對集合類型的應用,意義是最為重大的,因為這有可能使效能得到大幅度的提高,我們在一對多關聯中,定義用來容納關聯對象的Set集合,並不是java.util.Set類型或其子類型,而是net.sf.hibernate.collection.Set類型,通過使用自訂集合類的實現,Hibernate實現了集合類型的消極式載入。
  •  要求News類中寫private Set editor;具體實作類別讓Hibernate賦予。

為了對集合類型使用消極式載入,我們必須如下配置集合的關聯部分:

<!-- 集合的lazy屬性設定為true,則為集合類型的消極式載入--><set name="editor" table="editor" lazy="true">    <key column="id"></key>    <element type="string" column="name"></element></set>

通過將<set>元素的lazy屬性設定為true來開啟集合類型的消極式載入特性。

我們看下面插入資料和查詢的測試代碼:

//插入News news = new News();news.setTitle("title");news.setContent("content");Set editor = new HashSet();editor.add("qinqin1");editor.add("qinqin2");news.setEditor(editor);session.save(news);//查詢News news=(News)session.get(News.class,1);//當集合lazy屬性為true,只有在調用集合的時候才會執行集合查詢語句,與使用get或load無關    Set editor = news.getEditor();//(1)    for(Object obj:editor){//(2)        System.out.println(obj.toString());    }

解析:

  當程式執行到(1)處時,這時並不會發起對關聯資料的查詢來載入關聯資料,只有運行到(2)處時,真正的資料讀取操作才會開始,這時Hibernate會根據緩衝中合格資料索引,來尋找合格實體物件。

4 屬性的消極式載入

  • 在Hibernate3中,引入了一種新的特性——屬性的消極式載入,這個機制又為擷取高效能查詢提供了有力的工具。在前面我們講大資料對象讀取時,在User對象中有一個resume欄位,該欄位是一個java.sql.Clob類型,包含了使用者的簡曆資訊,當我們載入該對象時,我們不得不每一次都要載入這個欄位,而不論我們是否真的需要它,而且這種大資料對象的讀取本身會帶來很大的效能開銷。
  • 在Hibernate3中,我們可以通過屬性消極式載入機制,來使我們獲得只有當我們真正需要操作這個欄位時,才去讀取這個欄位資料。
  • 屬性的消極式載入用的少,故瞭解

hibernate消極式載入

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.