重學(xué)一遍hibernate艺沼,查漏補(bǔ)缺昨登,自己還有諸多東西需要學(xué)習(xí)鴨!
一冀瓦、one-to-many伴奥、many-to-one、many-to-many使用時(shí)注意!!!實(shí)體類的tostring()方法翼闽,避免循環(huán)遞歸調(diào)用造成StackOverflowError錯(cuò)誤拾徙。
二、hibernate中的延遲加載(lazyload)分[屬性的延遲加載]和[關(guān)系的延遲加載]
one-to-many:Category-to-Product
- 屬性的延遲加載:當(dāng)使用load的方式來獲取對(duì)象的時(shí)候感局,只有訪問了這個(gè)對(duì)象的屬性尼啡,hibernate才會(huì)到數(shù)據(jù)庫中進(jìn)行查詢。否則不會(huì)訪問數(shù)據(jù)庫蓝厌;
ps:get和load的區(qū)別玄叠,對(duì)id不存在的對(duì)象處理方式
I. get方式會(huì)返回null
II. load方式會(huì)拋出異常
Product p1 = (Product) session.load(Product.class, 2);
System.out.println("延遲加載!M靥帷读恃!");
System.out.println(p1.getName());//獲取name時(shí)才訪問數(shù)據(jù)庫
- 延遲加載又叫l(wèi)azyload,在one-many many-many的時(shí)候都可以使用關(guān)系的延遲加載代态;
Category c = (Category) session.get(Category.class, 1);
System.out.println(c.getName());
System.out.println("延遲加載K卤埂!蹦疑!");
System.out.println(c.getProducts());//獲取products時(shí)才會(huì)再次查詢數(shù)據(jù)庫
System.out.println("結(jié)束N魅浮!歉摧!");
三艇肴、hibernate中的級(jí)聯(lián)操作
- 什么是級(jí)聯(lián)腔呜? 簡單的說,沒有配置級(jí)聯(lián)的時(shí)候再悼,刪除分類核畴,其對(duì)應(yīng)的產(chǎn)品不會(huì)被刪除。 但是如果配置了恰當(dāng)?shù)募?jí)聯(lián)冲九,那么刪除分類的時(shí)候谤草,其對(duì)應(yīng)的產(chǎn)品都會(huì)被刪除掉。
- 四種級(jí)聯(lián):
包括上一步說的刪除用得級(jí)聯(lián)莺奸,級(jí)聯(lián)有4種類型:
all:所有操作都執(zhí)行級(jí)聯(lián)操作丑孩;
none:所有操作都不執(zhí)行級(jí)聯(lián)操作;
delete:刪除時(shí)執(zhí)行級(jí)聯(lián)操作灭贷;
save-update:保存和更新時(shí)執(zhí)行級(jí)聯(lián)操作温学;
級(jí)聯(lián)通常用在one-many和many-to-many上,幾乎不用在many-one上氧腰。
四枫浙、hibernate緩存
- hibernate默認(rèn)是開啟一級(jí)緩存的,一級(jí)緩存存放在session上
- 二級(jí)緩存是在SessionFactory上需要插件古拴,如ehcahe等
五箩帚、Hibernate有兩種方式獲得session,分別是: openSession和getCurrentSession
他們的區(qū)別在于
- 獲取的是否是同一個(gè)session對(duì)象
openSession每次都會(huì)得到一個(gè)新的Session對(duì)象
getCurrentSession在同一個(gè)線程中,每次都是獲取相同的Session對(duì)象黄痪,但是在不同的線程中獲取的是不同的Session對(duì)象 - 事務(wù)提交的必要性
openSession只有在增加紧帕,刪除,修改的時(shí)候需要事務(wù)桅打,查詢時(shí)不需要的
getCurrentSession是所有操作都必須放在事務(wù)中進(jìn)行是嗜,并且提交事務(wù)后,session就自動(dòng)關(guān)閉挺尾,不能夠再進(jìn)行關(guān)閉