以前仔細研究過hibernate,現在隨著專案接觸,也慢慢的有所深入,下面將自己的一些新的體會發出來。
1.盡量少用one-to-many的對映,如果用請把lazy設定成true,這樣在查詢主表時所有關聯的子表就不會查詢了,更不會浪費資料庫的資源。
2. 如果lazy="true"時,如果需要(用criteria或者detachedcriteria)查詢子表物件,則會丟擲乙個session closed的異常,因為查詢完主表物件hibernate的session就已經關閉了,所以是查詢不到的,如果想要查詢子表物件,請在one-to-many的設定屬性fetch="join",這說明只要查詢時就去抓取子物件,是hibernate的一種抓取策略。
3.如果lazy="true"並且fetch="join"時,用qbc進行分頁查詢,會帶來新的問題,fetch="join"是採用左外連線查詢的,所以主表的資料就會出現很多重覆記錄,這時需在qbc條件物件加上乙個去重的限制,具體**為:
criteria.setresulttransformer(criteria.distinct_root_entity);
換句話說fetch是為子物件服務的,不適合主物件的查詢操作.
4. 如果用hql查詢則一切正常,不用加去重操作,子物件也可以查詢出來.
5. 如果lazy="false"時,並沒有設定fetch屬性,用hql查詢也會丟擲乙個sessin closed 異常,所以需要在hql寫上抓取子物件的關鍵字,例如:from main join fetch main.detail as detail,這樣在獲取子物件屬性時就關採取抓取策略.
6. 在使用detachedcriteria拼湊查詢條件的時候,如何條件涉及到子物件的屬性時,需要用detachedcriteria.createalias("b","b"),來建立對映關係,不然會下面這個異常
org.springframework.orm.hibernate3.hibernatequeryexception: could not resolve property
假如:實體a中包含set
那麼在detachedcriteria 中拼湊查詢條件時,如果條件是b中的某個屬性bp1的話,那麼應該通過createalias()建立 實體a於b的關聯,例:criteria.createalias("b", "b"),那麼你在新增b的查詢條件的時候,add(restrictions.eq("b.bp1","test"));
時才不會報錯,不然會報找不到屬性b.bp1,當然在設定了關聯之後還會引發乙個問題也就是上面提到的重複問題,因為設定關聯之後hibernate是使用左外連線拼接的sql,這裡的解決方案就是也需要加上上面提到的去除重複資料的**即可.
當然新增實體之間的關聯之後,會把b也載入出來,就算設定了延遲載入也沒用。
說所以說為了效能 在拼湊查詢條件的時候能不設定關聯就不關聯。
跳槽經驗談
每年年初跳槽最多,跳槽是一門學問,也是一種策略。跳槽並不意味著你就能夠取得職業的成功,當面臨跳槽時,如何順利地完成跳槽,從而取得職業的成功呢?以下是一些切身體會,值得大家參考。1 不要指望會一下子能夠跳到多麼好的公司,絕大多數公司都乙個樣子。比如用友 金蝶 亞信 神馬這些公司,其實基本上乙個樣子。2...
程式設計經驗談
不知不覺做軟體已經做了十年,有成功的喜悅,也有失敗的痛苦,但總不敢稱自己是高手,因為和我心目中真正的高手們比起來,還差的太遠。世界上並沒有成為高手的捷徑,但一些基本原則是可以遵循的。紮實的基礎。資料結構 離散數學 編譯原理,這些是所有電腦科學的基礎,如果不掌握他們,很難寫出高水平的程式。據我的觀察,...
程式設計經驗談
1 萬丈高樓平地起。基礎是一切技能的本源,只有打好基礎,才能談得上提高,才能談得上有靈感,有突破。2 書上學的終覺淺。程式設計是一門實踐性極強的工作,只有通過不斷的程式設計實踐,才能積累程式設計經驗 提高程式設計能力,才能真正成為一名合格的開發者。3 曲徑通幽處。學習程式設計的道路是充滿艱辛的,漫長...