Hibernate中1+N問題以及解決方案

來源:互聯網
上載者:User

標籤:操作   query   word   current   .com   select   預設   解決辦法   關係   

1. Hibernate中的1+N問題描述   

        在多對一關聯性中,當我們需要查詢多的一方對應的表的記錄時,可以用一條sql語句就能完成操作。然而,在多的一方的實體類中的@ManyToOne標註的fetch的預設值是fetchType.EAGER,這時,hibernate除了發出查詢多的一方對應的表的記錄的sql語句外,還會發出n(多方記錄數)條sql語句,這就是1+n問題。如:bbs的板塊(Category),主題(topic),回複(msg)。一個板塊有多個主題,而一個主題屬於一個板塊,則Category和topic屬於一對多的關係,在topic裡設定@ManyToOne。當需要取出所有的主題時,只需要發出select * from topic一條語句就能做到。然而,hibernate會查詢出每個topic所對應的Category,所以會發出1+n條sql語句。

 

2. 1+N問題的解決辦法

 

    ①設定@ManyToOne的fetch屬性值為fetchType.LAZY,這種方式解決後,後面的n條sql語句按需而發。但是有個弊端,就是如果需要級聯查詢就無法擷取級聯對象了。

    ②設定@BatchSize(size=5)(該註解要加在類上面,跟@Entity在同一位置),這樣發出的sql語句減少。這個設定在一定程度上提高了效率。

    ③在hqp語句中使用用join fetch,事實上Criteria用的就是這種方法。這也是最常用的方法;

 

  1.  @Test
  2.  //join fetch
  3.  publicvoid test1_N3(){
  4.  Session session=sf.getCurrentSession();
  5.  session.beginTransaction();
  6.  //List<Topic> topics=(List<Topic>)session.createCriteria(Topic.class).list();//只有一條查詢語句,Criteria方法就是這種方式
  7.  List<Topic> topics=(List<Topic>)session.createQuery("from Topic t left join fetch t.category c").list();
  8.  for (Topic t:topics) {
  9.  System.out.println(t.getId()+"----"+t.getTitle());
  10.  System.out.println(t.getCategory().getName());
  11.  }
  12.  session.getTransaction().commit();
  13.  }

        這就是Hibernate中的1+N問題

Hibernate中1+N問題以及解決方案

相關文章

聯繫我們

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