hibernate如何優(yōu)化的授課筆記_第1頁
hibernate如何優(yōu)化的授課筆記_第2頁
hibernate如何優(yōu)化的授課筆記_第3頁
hibernate如何優(yōu)化的授課筆記_第4頁
hibernate如何優(yōu)化的授課筆記_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

hibernate優(yōu)化筆記hibernate優(yōu)化講課步驟:1.即時加載: 默認為true,代表加載延時加載策略,當改為false時代表不啟用延時加載策略. 在hibernate2中默認為false,但在hibernate3中默認為ture, 在查詢中,用對象才查詢.2.延遲加載: 演示對對象的查詢,在用對象的時候,才執(zhí)行操作! 演示對子表的操作,在用對象的時候,才執(zhí)行操作!(one-to-many父表多條記錄) 推薦:對常用字段做lazy=false,集合對象使用lazy=true;3.預先加載: 演示out-join4.批量加載: 演示查詢子父表,不用批量加載是1+n的關(guān)系!用批量加載是1+1的關(guān)系! 在one-to-many中!循環(huán)讀取子表內(nèi)容時使用. batch-size="5":不推薦使用非常大的值! select*fromtablewhereid=1; select*fromtablewhereid=2; 轉(zhuǎn)換為 select*fromtablewhereid=1orid=2;5.List和Iterator6.inverse:默認為false,默認為關(guān)聯(lián)更新; inverse:默認為false!所以inverse屬性默認會進行“關(guān)聯(lián)更新”。 inverse=false————反映;inverse=true————不反映” 當inverse在主表時,inverse為false時! 先執(zhí)行insert主,再insert子,然后再update子! 當inverse在主表時,inverse為true時! 先執(zhí)行insert主,再insert子. 只對set+many-to-many設(shè)置inverse=false,其他的inverse=false。 糟糕的是,不設(shè)置inverse屬性時,inverse默認為false。 在一對多關(guān)系中inverse就更有意義了。在多對多中,在哪端inverse="true"效果差不多(在效率上)。但是在一對多中,如果要一方維護關(guān)系,就會使在插入或是刪除"一"方時去update"多"方的每一個與這個"一"的對象有關(guān)系的對象。而如果讓"多"方面維護關(guān)系時就不會有update操作,因為關(guān)系就是在多方的對象中的,直指插入或是刪除多方對象就行了。讓"多"方維護關(guān)系更直觀一些。 DEMOSHOW: 1.inverse="false" 主對象包含子對象! Useru=newUser(); Messagemessage=newMessage(); u.getMessages().add(message); session.save(u); sql語句回滾,因為調(diào)用了,一條都沒有進去! updatemessagesetUSER_ID=?whereid=? (即便加入message.setUser(u),但是仍然回滾!) 2.inverse="true" 同上,主控方在從。順利插入user對象! 會比false少一條sql語句! 如果上面還不懂: 2.5 one-to-many的關(guān)系! inverse="false" Useru=newUser(); session.update(u); 結(jié)果 Hibernate:updateusersetuserName=?,passWord=?whereid=? Hibernate:updatemessagesetUSER_ID=nullwhereUSER_ID=? 2條sql語句,對父表做的任何動作,都會更新到子表中去! inverse="true" Useru=newUser(); session.update(u); 只有一條sql語句,正常! 3.但是(之前都是沒有加cascade="save-update"的情況?。? Useru=newUser(); Messagemessage=newMessage(); u.getMessages().add(message); message.setUser(u);//即便加入這句話! session.save(u); 代碼仍然不能插入message!只插入了user對象! 因為你save的是user對象!除非加入casecade="save-update"才會加入message對象!7.cascade:默認為none; 級聯(lián)(cascade)屬性的作用: 只有“關(guān)系標記”才有cascade屬性:many-to-one,one-to-one,any, set(map,bag,idbag,list,array)+one-to-many(many-to-many) all:所有情況下均進行關(guān)聯(lián)操作。 none:所有情況下均不進行關(guān)聯(lián)操作。這是默認值。 save-update:在執(zhí)行save/update/saveOrUpdate時進行關(guān)聯(lián)操作。 delete:在執(zhí)行delete時進行關(guān)聯(lián)操作。 演示:在插入主表時,子表是否會發(fā)生改變! cascade=all發(fā)生改變,none不發(fā)生改變. 插入主表,對象包含子表,none的化,子表沒有記錄存在; 存儲時主,從兩方都需要在對象中包含對方,否則,插入總是有問題的!(演示)8.cascade和inverse有什么區(qū)別?可以這樣理解,cascade定義的是關(guān)系兩端對象到對象的級聯(lián)關(guān)系;而inverse定義的是關(guān)系和對象的級聯(lián)關(guān)系。 inverse,cascade的比較 inverse,cascade這兩個屬性本身互不影響,但起的作用有些類似,都能引發(fā)對關(guān)系表的更新。 inverse只對set+one-to-many(或many-to-many)有效,對many-to-one,one-to-one無效。 cascade對關(guān)系標記都有效。 兩個起作用的時機不同: cascade:在對主控方操作時,級聯(lián)發(fā)生。 inverse:在flush時(commit會自動執(zhí)行flush),對session中的所有set,hibernate判斷每個set是否有變化, 對有變化的set執(zhí)行相應(yīng)的sql,執(zhí)行之前,會有個判斷:if(inverse==true)return; 可以看出cascade在先,inverse在后。 對cascade,一般對many-to-one,many-to-many不設(shè)置級聯(lián)刪除。9.Hibernate可以通過設(shè)置hibernate.jdbc.fetch_size,hibernate.jdbc.batch_size等屬性,對Hibernate進行優(yōu)化。10. 默認都是false!在class字段設(shè)置! DynamicUpdate如果選定,則生成UpdateSQL時不包含未發(fā)生變動的字段屬性,這樣可以在一定程度上提升SQL執(zhí)行效能.DynamicInsert如果選定,則生成InsertSQL時不包含未發(fā)生變動的字段屬性,這樣可以在一定程度上提升SQL執(zhí)行效能集合的過濾: 1。children=session.createFilter(parent.getChildren(),"wherethis.age>5andthis.age<10").list() 針對一對多關(guān)聯(lián)當中的集合元素非常龐大的情況,特別適合于龐大集合的分頁: 2。session.createFilter(parent.getChildren(),"").setFirstResult(0).setMaxResults(10).list(); 傾向于細顆粒度的設(shè)計,面向?qū)ο螅瑢⒋蟊聿鸱譃槎鄠€關(guān)聯(lián)關(guān)系的小表,消除冗余 (DBA比較忌諱關(guān)聯(lián)關(guān)系的出現(xiàn),但是ORM的緩存將突破關(guān)聯(lián)關(guān)系 column,通過二級緩存提升性能 的性能瓶頸);Hibernate的性能瓶頸不在于關(guān)聯(lián)關(guān)系,而在于大表的操作性能口訣1、使用雙向一對多關(guān)聯(lián),不使用單向一對多2、靈活使用單向多對一關(guān)聯(lián)3、不用一對一,用多對一取代4、配置對象緩存,不使用集合緩存5、一對多集合使用Bag,多對多集合使用Set6、繼承類使用顯式多態(tài)7、表字段要少,表關(guān)聯(lián)不要怕多,有二級緩存撐腰1、到底在哪用cascade="..."?cascade屬性并不是多對多關(guān)系一定要用的,有了它只是讓我們在插入或刪除對像時更方便一些,只要在cascade的源頭上插入或是刪除,所有cascade的關(guān)系就會被自己動的插入或是刪除。便是為了能正確的cascade,unsaved-value是個很重要的屬性。Hibernate通過這個屬性來判斷一個對象應(yīng)該save還是update,如果這個對象的id是unsaved-value的話,那說明這個對象不是persistenceobject要save(insert);如果id是非unsaved-value的話,那說明這個對象是persistenceobject(數(shù)據(jù)庫中已存在),只要update就行了。saveOrUpdate方法用的也是這個機制。2、到底在哪用inverse="ture"?inverse屬性默認是false的,就是說關(guān)系的兩端都來維護關(guān)系。這個意思就是說,如有一個Student,Teacher和TeacherStudent表,Student和Teacher是多對多對多關(guān)系,這個關(guān)系由TeacherStudent這個表來表現(xiàn)。那么什么時候插入或刪除TeacherStudent表中的記錄來維護關(guān)系呢?在用hibernate時,我們不會顯示的對TeacherStudent表做操作。對TeacherStudent的操作是hibernate幫我們做的。hibernate就是看hbm文件中指定的是"誰"維護關(guān)系,那個在插入或刪除"誰"時,就會處發(fā)對關(guān)系表的操作。前提是"誰"這個對象已經(jīng)知道這個關(guān)系了,就是說關(guān)系另一頭的對象已經(jīng)set或是add到"誰"這個對象里來了。前面說過inverse默認是false,就是關(guān)系的兩端都維護關(guān)系,對其中任一個操作都會處發(fā)對表系表的操作。當在關(guān)系的一頭,如Student中的bag或set中用了inverse="true"時,那就代表關(guān)系是由另一關(guān)維護的(Teacher)。就是說當這插入Student時,不會操作TeacherStudent表,即使Student已經(jīng)知道了關(guān)系。只有當Teacher插入或刪除時才會處發(fā)對關(guān)系表的操作。所以,當關(guān)系的兩頭都用inverse="true"是不對的,就會導致任何操作都不處發(fā)對關(guān)系表的操作。當兩端都是inverse="false"或是default值是,在代碼對關(guān)系顯示的維護也是不對的,會導致在關(guān)系表中插入兩次關(guān)系。在一對多關(guān)系中inverse就更有意義了。在多對多中,在哪端inverse="true"效果差不多(在效率上)。但是在一對多中,如果要一方維護關(guān)系,就會使在插入或是刪除"一"方時去update"多"方的每一個與這個"一"的對象有關(guān)系的對象。而如果讓"多"方面維護關(guān)系時就不會有update操作,因為關(guān)系就是在多方的對象中的,直指插入或是刪除多方對象就行了。當然這時也要遍歷"多"方的每一個對象顯示的操作修關(guān)系的變化體現(xiàn)到DB中。不管怎樣說,還是讓"多"方維護關(guān)系更直觀一些。3、cascade和inverse有什么區(qū)別?可以這樣理解,cascade定義的是關(guān)系兩端對象到對象的級聯(lián)關(guān)系;而inverse定義的是關(guān)系和對象的級聯(lián)關(guān)系。4、net.sf.hibernate.ObjectDeletedException:deletedobjectwouldbere-savedbycascade(removedeletedobjectfromassociations):2,ofclass:Xxxxx這個問題出現(xiàn)在要刪除關(guān)系的一頭時。如,要刪除一個已經(jīng)和Student有關(guān)系的Teacher。當mit();時才會拋出這個異常。這時一個在關(guān)系另一頭的Student對象中的Set或是List中把這個Teacher對象顯示的remove掉,再session.delete(這個teacher);。這是為了防止在Student端有cascade時把這個Teacher對象再存回DB。所以,這個異常的只有在Student的關(guān)系定義中有cascade="...",而且沒有像上面說的顯示的解除關(guān)系時才會出現(xiàn)。所以防止出現(xiàn)這個異常的方法就是:1,在Student端不用cascade;2,或是用cascade的話,就顯示的刪除對像中的關(guān)系。3,在Teacher端要用cascade5、net.sf.hibernate.HibernateException:identifierofaninstanceofmy.MyObjectalteredfromNtoN這個異常其時不是多對多中常遇到的,但是這個異常的提示不makesense,所以提一下,是因為id的java對象中的type和hbm文件中定義的不一樣,如:java中用long,而hbm中用type="integer",并且generator用的是identity時就會出現(xiàn)Hibernate查詢:hql支持動態(tài)綁定查詢參數(shù)[select/update/delete...][from...][where...][groupby...[having...]][orderby...]1.createQuery接口 直接拼接sql: fromUserasuwhereu.passWord>20 根據(jù)參數(shù)位置設(shè)置參數(shù): fromUserasuwhereu.passWord>? 根據(jù)參數(shù)名稱標識參數(shù): Queryquery=session.createQuery("fromUserasuwhereu.passWord>:passWord"); query.setInteger("passWord",20); 用:指定參數(shù)名稱 :=等于 <>:不等于 >: <: >=: <=: like: and: or: not: isnull: in(1,2,3): list:可以按照索引來隨機訪問,但不管是否用到了,都將數(shù)據(jù)轉(zhuǎn)換為實體對象。 iterator:只能順序訪問,但是只把使用到的轉(zhuǎn)換成了實體對象, 使用query實現(xiàn)數(shù)據(jù)庫的更新: Queryquery=session.createQuery("updateUsersetpassWord=passWord+1"); query.executeUpdate(); 批量刪除: Queryquery=session.createQuery("deleteUserwherepassWord>30"); query.executeUpdate(); 不用select: 用select(屬性查詢): Queryquery=session.createQuery("selectu.passWordfromUseru"); Listlist=query.list(); for(Objectobject:list){ System.out.println(object); } 動態(tài)構(gòu)造實例方法: Queryquery=session.createQuery("selectnewUser(u.passWord)fromUseru"); Iteratorlist=query.iterate(); while(list.hasNext()){ Useru=(User)list.next(); System.out.println(u.getUserName()+""+u.getPassWord()); } 注意:使用屬性的構(gòu)造參數(shù)一定要存在,取出的是java對象,僅僅是結(jié)構(gòu),而不是 持久化對象! 使用sql的原生函數(shù): selectupper()fromUseru selectdistinct(u.userName)fromUseru count() Queryquery=session.createQuery("selectcount(u),u.passWordfromUserugroupbypassWord"); Iteratorlist=query.iterate(); while(list.hasNext()){ Object[]o=(Object[])list.next(); System.out.println(o[0]+""+o[1]); } Queryquery=session.createQuery("selectcount(u),u.passWordfromUserugroupbypassWordhavingu.passWord>25"); Ite

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論