欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Hibernate中的flush機(jī)制

 更新時(shí)間:2015年01月15日 11:15:21   投稿:junjie  
這篇文章主要介紹了深入理解Hibernate中的flush機(jī)制,本文是對(duì)flush機(jī)制深入研究得出的一些結(jié)論總結(jié),需要的朋友可以參考下

針對(duì)昨天同事遇到的hibernate的問(wèn)題。算是hibernate最基本的東西。具了解,這個(gè)問(wèn)題很多人遇到過(guò),也很常見(jiàn),卻遇到了還經(jīng)常會(huì)懵了。

為了加深印象,知其然,知其所以然。

之后單純用原始的Hibernate框架做了一些驗(yàn)證,并且打開(kāi)執(zhí)行SQL打印輸出臺(tái)的,得出的結(jié)論:

前提是在同一事務(wù)中間:

1、利用sql語(yǔ)句, session.createSQLQuery(sql).executeUpdate();進(jìn)行插入,輸出臺(tái)打印出sql插入語(yǔ)句; 再利用sql語(yǔ)句,進(jìn)行session.createSQLQuery(sql).uniqueResult(); 也會(huì)打印SQL查詢(xún)語(yǔ)句,沒(méi)有問(wèn)題,可以查詢(xún)到數(shù)據(jù)。

2、利用hibernate封裝操作, session.save(entity); 進(jìn)行插入,輸出臺(tái)并沒(méi)有打印出插入的SQL語(yǔ)句, 再利用 session.get(entity,id);方法做查詢(xún) ;也沒(méi)有打印出SQL查詢(xún)語(yǔ)句,但是是可以查詢(xún)到數(shù)據(jù)的。到執(zhí)行事務(wù)提交語(yǔ)句時(shí),插入的SQL語(yǔ)句被打印出來(lái)

3、利用hibernate的session.save(entity); 進(jìn)行插入,再利用《HQL》語(yǔ)句進(jìn)行查詢(xún),效果同上面第二點(diǎn)。

4、利用hibernate的session.save(entity); 進(jìn)行插入,輸出臺(tái)并沒(méi)有打印出插入的SQL語(yǔ)句。 再利用sql語(yǔ)句,進(jìn)行session.createSQLQuery(sql).uniqueResult(); 會(huì)打印SQL查詢(xún)語(yǔ)句。問(wèn)題出現(xiàn)了,查詢(xún)不到任何數(shù)據(jù)。這種情況下利用session.flush()方法,在查詢(xún)之前執(zhí)行到flush()方法,輸出臺(tái)會(huì)打印出插入的SQL語(yǔ)句。 再進(jìn)行查詢(xún)就有數(shù)據(jù)。

驗(yàn)證完成之后,查了下往上資料,對(duì)于第四點(diǎn),在開(kāi)發(fā)過(guò)程中出現(xiàn)頻繁,非常的常見(jiàn),相信很多人都曾遇到,但又有很多人繼續(xù)摸不到頭腦。正好以此加深了印象。

從打印控制臺(tái)SQL可以看出一個(gè)基本的hibernate save方法的操作流程:

1. 判斷所要保存的實(shí)例是否已處于持久化狀態(tài),如果不是,則將其置入緩存;

2. 根據(jù)所要保存的實(shí)例計(jì)劃一條insert sql語(yǔ)句,注意只是計(jì)劃,并不執(zhí)行;

3. 事務(wù)提交時(shí)執(zhí)行之前所計(jì)劃的insert語(yǔ)句;

將tx.commit()換成session.flush,此時(shí)控制太打印出了insert語(yǔ)句,但是數(shù)據(jù)庫(kù)中并沒(méi)有添加新的記錄;

flush方法的主要作用就是清理緩存,強(qiáng)制數(shù)據(jù)庫(kù)與Hibernate緩存同步,以保證數(shù)據(jù)的一致性。它的主要?jiǎng)幼骶褪窍驍?shù)據(jù)庫(kù)發(fā)送一系列的sql語(yǔ)句,并執(zhí)行這些sql語(yǔ)句,但是不會(huì)向數(shù)據(jù)庫(kù)提交。而commit方法則會(huì)首先調(diào)用flush方法,然后提交事務(wù)。這就是為什么我們僅僅調(diào)用flush的時(shí)候記錄并未插入到數(shù)據(jù)庫(kù)中的原因,因?yàn)橹挥刑峤涣耸聞?wù),對(duì)數(shù)據(jù)庫(kù)所做的更新才會(huì)被保存下來(lái)。因?yàn)閏ommit方法隱式的調(diào)用了flush,所以一般我們都不會(huì)顯示的調(diào)用flush方法。

這是hibernate的flush機(jī)制。在一些復(fù)雜的對(duì)象更新和保存的過(guò)程中就要考慮數(shù)據(jù)庫(kù)操作順序的改變以及延時(shí)flush是否對(duì)程序的結(jié)果有影響。如果確實(shí)存在著影響,那就可以在需要保持這種操作順序的位置加入flush強(qiáng)制Hibernate將緩存中記錄的操作flush入數(shù)據(jù)庫(kù),這樣看起來(lái)也許不太美觀,但很有效。

疑問(wèn):session.save方法,放入緩存中,SQL直接查詢(xún)數(shù)據(jù)庫(kù)是查不出來(lái)的。

flush()方法之后,會(huì)打印出執(zhí)行SQL,但是數(shù)據(jù)庫(kù)中,還是沒(méi)有。SQL直接查詢(xún)卻能查出數(shù)據(jù)來(lái)。

1、flush() 之后這個(gè)實(shí)體數(shù)據(jù)存放在什么地方?和save()方法一樣的緩存,那SQL也應(yīng)該是取不到的。

2、既然flush方法之后數(shù)據(jù)沒(méi)有進(jìn)數(shù)據(jù)庫(kù),SQL直接查詢(xún),利用session.createSQLQuery(sql) 查詢(xún),直接查得應(yīng)該不是數(shù)據(jù)庫(kù),他查詢(xún)的又是什么地方?

相關(guān)文章

  • Springboot的yml配置文件用法

    Springboot的yml配置文件用法

    這篇文章主要介紹了Springboot的yml配置文件用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring Boot整合mybatis并自動(dòng)生成mapper和實(shí)體實(shí)例解析

    Spring Boot整合mybatis并自動(dòng)生成mapper和實(shí)體實(shí)例解析

    本文是小編給大家總結(jié)的關(guān)于Spring Boot整合mybatis并自動(dòng)生成mapper和實(shí)體的內(nèi)容,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • 30分鐘入門(mén)Java8之lambda表達(dá)式學(xué)習(xí)

    30分鐘入門(mén)Java8之lambda表達(dá)式學(xué)習(xí)

    本篇文章主要介紹了30分鐘入門(mén)Java8之lambda表達(dá)式學(xué)習(xí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)的示例代碼

    Java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)的示例代碼

    泛型是JAVA重要的特性,使用泛型編程,可以使代碼復(fù)用率提高。本文將利用泛型實(shí)現(xiàn)簡(jiǎn)單的棧結(jié)構(gòu),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • 如何修改JSON字符串中的敏感信息

    如何修改JSON字符串中的敏感信息

    這篇文章主要介紹了如何修改JSON字符串中的敏感信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 經(jīng)典的Java面試題及回答集錦(基礎(chǔ)篇)

    經(jīng)典的Java面試題及回答集錦(基礎(chǔ)篇)

    本文給大家收藏整理了java面試題及回答,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-03-03
  • Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的示例

    Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的示例

    這篇文章主要介紹了Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的示例,幫助大家方便的進(jìn)行文件格式轉(zhuǎn)換,完成需求,感興趣的朋友可以了解下
    2020-11-11
  • Maven將Jar包打入本地倉(cāng)庫(kù)的實(shí)現(xiàn)

    Maven將Jar包打入本地倉(cāng)庫(kù)的實(shí)現(xiàn)

    項(xiàng)目需要用到一個(gè)Jar包,不能從遠(yuǎn)程倉(cāng)庫(kù)拉取,只有一個(gè)Jar包,所以需要將Jar包打入到本地倉(cāng)庫(kù)才能引入項(xiàng)目,本文主要介紹了Maven將Jar包打入本地倉(cāng)庫(kù)的實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • Java中API的使用方法詳情

    Java中API的使用方法詳情

    這篇文章主要介紹了Java中API的使用方法詳情,指的就是?JDK?中提供的各種功能的?Java類(lèi),這些類(lèi)將底層的實(shí)現(xiàn)封裝了起來(lái),我們不需要關(guān)心這些類(lèi)是如何實(shí)現(xiàn)的,只需要學(xué)習(xí)這些類(lèi)如何使用即可,我們可以通過(guò)幫助文檔來(lái)學(xué)習(xí)這些API如何使用,需要的朋友可以參考下
    2022-04-04
  • 詳解Spring Data JPA使用@Query注解(Using @Query)

    詳解Spring Data JPA使用@Query注解(Using @Query)

    本篇文章主要介紹了詳解Spring Data JPA使用@Query注解(Using @Query),具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07

最新評(píng)論