hibernate的懶載入和查詢

來源:互聯網
上載者:User

1:hibernate的懶載入(通過asm和cglib包實現)代理對象實現
2:單個對象的查詢
   總之對於get和load的根本區別,一句話,hibernate對於load方法認為該資料在資料庫中一定存在,可以放心的使用代理來消極式載入,如果在使用過程中發現了問題,只能拋異常;
   而對於get方法,hibernate一定要擷取到真實的資料,否則返回null。get()方法與load()方法的區別就在於不會尋找二級緩衝。
   一般像在給另外一個對象設定關係時採用load方法擷取對象
   返回對象後session關閉再訪問對象,會報無法初始化代理.可以通過反射查看類名(返回的是個代理對象)[下面的懶載入相同]
   解決辦法:通過hibernate.initialize(對象)初始化或者訪問對象的屬性;
3:一對一(對系統效能的提高影響不是很大)
  hibernate預設情況下查詢主對象不採用懶載入.
  查詢從對象時採用懶載入.(constrained等於"true" lazy等於"proxy(預設)/false/true" fetch等於"select(預設)【通過兩次select查詢,效率沒有join高】/join")
  fetch的配置如果為join,lazy會無效了.
4:一對多跟多對多
  資料庫查詢的開銷跟網路傳輸的開銷
  lazy跟fetch同上(預設就是懶載入)
5:懶載入時訪問它的ID和Class不會去訪問資料庫,因為ID在另外一個對象中已經有了,呵呵
6:對屬性的懶載入[比較麻煩,需要等編譯後再修改,一般對大欄位可能需要處理]
7:query的iterate方法(N+1問題)
      工作原理如下:先取得所有的ID,然後根據ID從緩衝中去讀取
     一級緩衝跟二級緩衝都找不到時,查資料庫。【如果有10條記錄,那麼查詢資料庫就會執行11次,其中一次是查ID】
     如果不能保證緩衝中有資料,iterate方法效率比較低
8:Criteria(條件查詢) 和 DetachedCriteria(離線條件查詢)
  session.createCriteria(User.class) 
  ----------------
  DetachedCriteria query = DetachedCriteria.forClass(User.class);
  query.getExecutableCriteria(session);
9:Native查詢
   Query query s.createQuery(from 對象名稱);
10:Query q s.createSQLQuery("select * from 表名")
  q.list();
  查出來的是Object數組
  解決:
  Query q s.createSQLQuery("select * from 表名").addEntity(User.alss);取得的為對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.