在繼續(xù)學習之前,我還是覺得有必要和大家來扯扯jpa與Hibernate之間的關(guān)系。JPA全稱Java Persistence API.是java5.0的一個規(guī)范,而hibernate可以看作這個規(guī)范的實現(xiàn)。就像接口和類的關(guān)系一樣叽唱,jpa是接口,hibernate是類嘶卧;但是這里要注意一下尔觉,是hibernate先流行起來了后才有了jpa凉袱。
Session概述
????Session是Hibernate向應(yīng)用程序提供操縱數(shù)據(jù)的最主要的接口芥吟,也是hibernate的核心接口,他提供了基本的保存专甩,修改钟鸵,刪除,添加和加載操作涤躲。
????Session緩存棺耍,有的叫Session緩存也有的叫一級緩存,位于緩存中的對象稱為持久化對象种樱,他和數(shù)據(jù)庫中的記錄是一一對應(yīng)的蒙袍,如果我們數(shù)據(jù)庫有兩天記錄,id為1嫩挤,name為’張三’害幅,pwd為’123’、id為2岂昭,name為’李四’以现,pwd為’1234’;如果我們這個時候查詢出這兩條記錄约啊,那么在Session緩存中會存放這兩條記錄的對象邑遏,兩個對象的屬性與兩條記錄的字段值相同。注意:Session能夠在某個時間點恰矩,按照緩存中對象變化來執(zhí)行sql語句记盒,這一過程稱為刷新緩存。
????站在持久化角度外傅,hibernate把對象分為三種狀態(tài):持久狀態(tài)纪吮、臨時狀態(tài)蹂午、游離狀態(tài)。Session的特定方法彬碱,可以將對象從一種狀態(tài)轉(zhuǎn)換成另一種狀態(tài)豆胸。
對象的三種狀態(tài)
通過上面的圖片可以更好的看出我們執(zhí)行什么方法的時候,對象就會變成某種狀態(tài)巷疼。
1.瞬時狀態(tài)(Transient)
????通過New創(chuàng)建對象晚胡,對象沒有立即持久化,此時Java對象的狀態(tài)為瞬時狀態(tài)嚼沿。Session對瞬時狀態(tài)的java對象是一無所知的估盘,此對象不在被別的對象引用時,java虛擬機會在一定時間段回收次對象骡尽。
2.持久狀態(tài)(Persistent)
????當對象與Session關(guān)聯(lián)遣妥,被Session管理時,該對象就處于持久狀態(tài)攀细。
3.游離狀態(tài)(Detached)
????處于持久狀態(tài)的對象箫踩,脫離與其關(guān)聯(lián)的Session管理后,對象就處于游離狀態(tài)谭贪。
狀態(tài)轉(zhuǎn)換:
1.瞬時狀態(tài)轉(zhuǎn)為持久狀態(tài)
????通過Session對象的save()境钟、saveOrUpDate()方法保存對象或者使用get()、load()方法獲取對象俭识。
2.持久狀態(tài)轉(zhuǎn)為瞬時狀態(tài)
????執(zhí)行Session的delete()方法后慨削,對象由持久狀態(tài)轉(zhuǎn)為瞬時狀態(tài)。
3.持久狀態(tài)轉(zhuǎn)為游離狀態(tài)
????執(zhí)行Session的evict()套媚、clear()缚态、close()方法,對象由持久狀態(tài)轉(zhuǎn)為游離狀態(tài)堤瘤。
4.游離狀態(tài)轉(zhuǎn)為持久狀態(tài)
????重新獲取Session對象玫芦,執(zhí)行Session對象的update()、saveOrUpdate()方法將對象從游離狀態(tài)變?yōu)槌志脿顟B(tài)宙橱,也就是說通過這兩個方法姨俩,可以將對象重新與Session關(guān)聯(lián)。
5.游離狀態(tài)轉(zhuǎn)為瞬時狀態(tài)
????執(zhí)行Session的delete()方法师郑。
注:處于瞬時狀態(tài)或游離狀態(tài)的對象不在被其他對象引用時环葵,會被java虛擬機回收。
有的人也說hibernate中對象有四種狀態(tài)宝冕,會多一種刪除狀態(tài)张遭,因為在執(zhí)行delete()方法刪除數(shù)據(jù)的時候,對象會處于刪除狀態(tài)地梨,當關(guān)閉session的時候?qū)ο筇幱谂R時狀態(tài)菊卷。我個人還是傾向于說三種狀態(tài)缔恳,delete()方法刪除后,對象直接處于臨時狀態(tài)洁闰。