1.Hibernate通過(guò)sessionFactory獲取session的方法
1)openSession()獲取一個(gè)新的session。
2)getCurrentSession()獲取當(dāng)前線程綁定的session尉咕。
區(qū)別:openSession()獲取一個(gè)新的session叠蝇,而getCurrentSession()獲取當(dāng)前線程綁定的session。getCurrentSession()獲取的session在事物提交后會(huì)自動(dòng)關(guān)閉年缎。openSession()獲取的則需要手動(dòng)關(guān)閉悔捶。
2.get()和load()的區(qū)別
1)get在執(zhí)行的時(shí)候先到一級(jí)和二級(jí)緩存區(qū)查找,如果沒(méi)有則直接執(zhí)行sql語(yǔ)句到數(shù)據(jù)庫(kù)查找单芜,如果查不到這個(gè)數(shù)據(jù)則返回null蜕该。
2)load也是先到一二級(jí)緩存區(qū)查找,如果沒(méi)有則返回一個(gè)代理對(duì)象洲鸠,等后面用到這個(gè)對(duì)象的時(shí)候才會(huì)去DB查找堂淡,這就是load默認(rèn)情況下支持延遲加載。如果不存在這個(gè)數(shù)據(jù)則會(huì)拋出異常扒腕。
3.解決n+1問(wèn)題
首先明確一下n+1問(wèn)題绢淀,當(dāng)兩張如學(xué)生信息表Student_info和成績(jī)匯總表SummaryGrade的關(guān)系是多對(duì)一的時(shí)候,如果對(duì)Student_info表進(jìn)行查詢(xún)操作瘾腰,則hibernate也會(huì)向多的那張表對(duì)應(yīng)SummaryGrade執(zhí)行查找操作皆的。
解決辦法:
1)設(shè)置@ManyToOne的fetch屬性為fetchType.LAZY,但這樣的話如果需要級(jí)聯(lián)查詢(xún)就無(wú)法獲取級(jí)聯(lián)對(duì)象了蹋盆。
2)設(shè)置@BatchSize(size=5)费薄,這個(gè)注釋放在和@Entity相同的位置硝全,這樣發(fā)出的多余的查詢(xún)語(yǔ)句就會(huì)減少,但這不是最優(yōu)雅的楞抡。
3)在hqp語(yǔ)句中使用用jion fecth伟众。這是最好方法。