日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Hibernateflush機(jī)制的理解

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

為英吉沙等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及英吉沙網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、英吉沙網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

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

之后單純用原始的Hibernate框架做了一些驗(yàn)證,并且打開執(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查詢語(yǔ)句,沒有問題,可以查詢到數(shù)據(jù)。

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

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

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

驗(yàn)證完成之后,查了下往上資料,對(duì)于第四點(diǎn),在開發(fā)過程中出現(xià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ù)中并沒有添加新的記錄;

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ì)被保存下來。因?yàn)閏ommit方法隱式的調(diào)用了flush,所以一般我們都不會(huì)顯示的調(diào)用flush方法。

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

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

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

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

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

原文鏈接:http://www.cnblogs.com/yanbincn/archive/2012/05/31/2529293.html


新聞標(biāo)題:Hibernateflush機(jī)制的理解
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/dhiesop.html