亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hibernate里的Fetch有什么用

發布時間:2021-12-05 16:38:36 來源:億速云 閱讀:273 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Hibernate里的Fetch有什么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Hibernate里的Fetch有什么用”這篇文章吧。

現在越來越發現其實掌握Hibernate Fetch 并不容易,Spring用起來其實簡單多了,但是在用Hibernate的時候真的是需要一定的時間積累,對一個項目組來說如果采用Hibernate***有一個對Hibernate比較清楚的人否則碰到問題就會成為項目的風險。
我想告訴各位的是,掌握Hibernate Fetch可能比你預期的難多了,當你輕松的告訴我,Hibernate Fetch很簡單的時候該是你自己多反省了. (只有一種情況例外,你是一個牛人)

好了,一個引子廢話那么多,其實今天只是想先說一說Hibernate Fetch的作用.

大家都知道,在Hibernate里為了性能考慮,引進了lazy的概念,這里我們以Parent和Child為模型來說明

public class Parent implements Serializable {       /** identifier field */      private Long id;       /** persistent field */      private List childs;       //skip all getter/setter method        }        public class Child implements Serializable {       /** identifier field */      private Long id;       /** persistent field */      private net.foxlog.model.Parent parent;       //skip all getter/setter method   }

在我們查詢Parent對象的時候,默認只有Parent的內容,并不包含childs的信息,如果在Parent.hbm.xml里設置lazy="false"的話才同時取出關聯的所有childs內容.

問題是我既想要Hibernate默認的性能又想要臨時的靈活性該怎么辦?  這就是Fetch的功能。我們可以把fetch與lazy="true"的關系類比為事務當中的編程式事務與聲明式事務,不太準確,但是大概是這個意思。

總值,fetch就是在代碼這一層給你一個主動抓取得機會.

Parent parent = (Parent)hibernateTemplate.execute(new HibernateCallback() {              public Object doInHibernate(Session session) throws HibernateException, SQLException {                  Query q = session.createQuery(                          "from Parent as parent "+                                  " left outer join fetch parent.childs " +                                  " where parent.id = :id"                  );                  q.setParameter("id",new Long(15));                  return (Parent)q.uniqueResult();              }           });           Assert.assertTrue(parent.getChilds().size() > 0);

你可以在lazy="true"的情況下把Fetch去掉,就會報異常. 當然,如果lazy="false"就不需要fetch了有一個問題,使用Fetch會有重復記錄的現象發生,我們可以理解為Fetch實際上不是為Parent服務的,而是為Child服務的.所以直接取Parent會有不匹配的問題.

參考一下下面的這篇文章 Hibernate集合初始化

update:以上有些結論錯誤,實際上在Hibernate3.2.1版本下測試,可以不出現重復記錄,

public void testNPlusOne() throws Exception{          List list = (List)hibernateTemplate.execute(new HibernateCallback() {              public Object doInHibernate(Session session) throws HibernateException, SQLException {                  Query q = session.createQuery(                          "select distinct p from net.foxlog.model.Parent p inner join fetch p.childs"                  );                  return q.list();              }           });           //((Parent)(list.get(0))).getChilds();          System.out.println("list size = " + list.size());          for(int i=0;i<list.size();i++){              Parent p = (Parent)list.get(i);              System.out.println("===parent = " + p);              System.out.println("===parent's child's length = " + p.getChilds().size());          }       }

打印結果如下:

Hibernate: select distinct parent0_.id as id2_0_, childs1_.id as id0_1_, childs1_.parent_id as parent2_0_1_, childs1_.parent_id as parent2_0__, childs1_.id as id0__ from parent parent0_ inner join child childs1_ on parent0_.id=childs1_.parent_id  list size = 3 ===parent = net.foxlog.model.Parent@1401d28[id=14]  ===parent's child's length = 1 ===parent = net.foxlog.model.Parent@14e0e90[id=15]  ===parent's child's length = 2 ===parent = net.foxlog.model.Parent@62610b[id=17]  ===parent's child's length = 3

另外,如果用open session in view模式的話一般不用Fetch,但首先推薦Fetch,如果非用的話因為有N+1的現象,所以可以結合batch模式來改善下性能.

以上是“Hibernate里的Fetch有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

延庆县| 峨眉山市| 扎兰屯市| 临湘市| 容城县| 手游| 蒙城县| 喀什市| 闽清县| 镇坪县| 外汇| 嘉祥县| 搜索| 柳河县| 响水县| 临武县| 扶沟县| 蒙山县| 当阳市| 安阳市| 舞钢市| 康平县| 明星| 龙州县| 余姚市| 赣榆县| 寿阳县| 青铜峡市| 小金县| 六安市| 达日县| 新宁县| 克拉玛依市| 慈利县| 伊春市| 富宁县| 洮南市| 平泉县| 麻城市| 永福县| 贵州省|