Hibernate之session接口

? ?session接口是hibernate重要的組成,session接口的實現中包含一系列java集合,這些集合構成了session緩存,只要session對象沒有結束生命周期,而且沒有清理緩存,那么存放在緩存中的對象也不會結束生命周期。該session緩存可減少應用程序訪問數據庫的次數,從而一定程度上提高效率。

例1:

public void testSessionCache() {

try {

News news = (News) session.get(News.class, 1);

System.out.println(news);

System.out.println("###########執行兩次get操作,若是取的對象一樣,那么第二次從session緩存中獲取#################################");

News news2 = (News) session.get(News.class, 1);

System.out.println(news2);

以上代碼僅僅執行一次select語句,news2是在緩存中提取。第一次查詢之后得到一個News對象,將這個引用傳遞給了news,同時也傳遞給了session緩存,再次查詢的時候首先在緩存中查看是否存在news對象,若是有那么就不再從數據庫獲取,而是直接獲取session緩存的news對象。

session緩存又叫做一級緩存。對session緩存的操作有三個方法:

flush():該方法由session指向數據庫,執行該方法的時候會檢查緩存中的對象狀態跟數據庫中(讀取的)的對象狀態(或者緩存中最初的對象)是否一致,若是不一致會觸發SQL操作(update or delete等)但是數據沒有改變的話,是不會發送SQL修改語句的。

@Test

public void sessionFlush() {

News news = (News) session.get(News.class, 1);

news.setAuthor("Oracle");

}

執行該測試代碼之后,會在select語句后面出現update語句,我們可以理解,當查詢出news對象之后,存在于session 緩存中,我們使用set方法使得該 session緩存中的對象的author屬性發生了變化,所以在事務提交之前,會調用flush()「通過單步調試發現在執行set()方法的時候,沒有發送update語句,在執行事務提交的過程中,首先會flush(),執行flush()之后發送語句,但是數據沒有更改,再繼續執行commit之后,數據庫發生變化」以保持數據庫中的數據跟session緩存中的一致。(注意,可以在獲取一個對象之后,然后立即(但不提交)修改某個屬性,此時打印出來的,一個是從數據庫中取得的屬性,另一個是剛set的屬性值,因為都是在緩存中,所以首先獲取到的是緩存中的數據)。

flush可能會發送SQL語句但是不會提交事務,此時數據庫中的數據不會發生改變。需要提交事務才會改變。

在沒有提交事務或者沒有顯示調用flush之前,也有可能進行flush操作(1.執行HQL或者QBC查詢的時候,會先進行flush,以保證得到數據表的最新記錄。2若記錄的ID生成策略是由底層數據庫使用自增方式native方式生成的,那么在調用save()方法后會立即發生SQL語句,因為save方法后必須保證對象的ID存在,但是若是ID由hibernate提供,則在執行commit()之后才會生成SQL語句)。

refresh():有數據庫指向緩存,強制使緩存中的數據跟數據庫保持一致,也就是強制發送一條select語句。

@Test

public void testRefresh() {

News news = (News) session.get(News.class, 4);

System.out.println(news);

session.refresh(news);//執行之后便會發送select語句,下面的打印是否是運行中修改的最新數據,還需要注意hibernate的事務隔離級別。

設置<property name="hibernate.connection.isolation">2</property>即可完成該效果

System.out.println(news);

}

clear():清理緩存,也就是將session緩存數據清空,若是再想重新獲取,必須重新發送SQL語句。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容