日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate中1+N问题以及解决方法

發(fā)布時間:2023/12/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate中1+N问题以及解决方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前些天發(fā)現(xiàn)了一個巨牛的人工智能學習網(wǎng)站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到教程。

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

??????? 在多對一關(guān)系中,當我們需要查詢多的一方對應(yīng)的表的記錄時,可以用一條sql語句就能完成操作。然而,在多的一方的實體類中的@ManyToOne標注的fetch的默認值是fetchType.EAGER,這時,hibernate除了發(fā)出查詢多的一方對應(yīng)的表的記錄的sql語句外,還會發(fā)出n(多方記錄數(shù))條sql語句,這就是1+n問題。如:bbs的板塊(Category),主題(topic),回復(msg)。一個板塊有多個主題,而一個主題屬于一個板塊,則Category和topic屬于一對多的關(guān)系,在topic里設(shè)置@ManyToOne。當需要取出所有的主題時,只需要發(fā)出select * from topic一條語句就能做到。然而,hibernate會查詢出每個topic所對應(yīng)的Category,所以會發(fā)出1+n條sql語句。

?

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

?

????①設(shè)置@ManyToOne的fetch屬性值為fetchType.LAZY,這種方式解決后,后面的n條sql語句按需而發(fā)。但是有個弊端,就是如果需要級聯(lián)查詢就無法獲取級聯(lián)對象了。

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

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

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

這就是Hibernate中的1+N問題,如有錯誤之處,歡迎留言指正~

總結(jié)

以上是生活随笔為你收集整理的Hibernate中1+N问题以及解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。