在Hbibernate中有自己的一套機(jī)制:FlushMode,它控制著持久化對(duì)象與數(shù)據(jù)庫(kù)的關(guān)系。FlushMode有四種狀態(tài):NERVER、AUTO、COMMIT和ALWAYS。默認(rèn)值為AUTO。Spring中使用Hibernate時(shí),會(huì)將FlushMode初始化為AUTO,不過(guò)在使用OpenSessionInViewFilter(Spring有自己的一個(gè)transcation,不過(guò)它只是作用在service層,如果想使持久化對(duì)象保留到view層,那么啟用這個(gè)過(guò)濾器之后就可以了)過(guò)濾器之后,Spring會(huì)將FlushMode設(shè)置為NERVER(表示持久化對(duì)象不在于數(shù)據(jù)庫(kù)中數(shù)據(jù)實(shí)時(shí)關(guān)聯(lián))。不知道大家在工程中是否用到了spring提供的事務(wù),在用到spring提供的HibernateTranscationManager管理事務(wù)時(shí)。當(dāng)調(diào)用的方法位于該管理器之下時(shí),spring會(huì)臨時(shí)的將FlushMode修改為AUTO狀態(tài),這樣如果你在view層有一個(gè)持久化對(duì)象,并且修改了這個(gè)持久化對(duì)象的狀態(tài),spring會(huì)自動(dòng)將這個(gè)持久化對(duì)象的狀態(tài)更新到數(shù)據(jù)庫(kù)中去。這樣可能會(huì)帶來(lái)困惑:明明沒(méi)有更新數(shù)據(jù)庫(kù),怎么數(shù)據(jù)庫(kù)中的值發(fā)生改變了呢?其實(shí)這也是持久層的意義所在:持久是將數(shù)據(jù)保存在持久層中的對(duì)象上,并使對(duì)象與數(shù)據(jù)是一致的,如果持久化對(duì)象狀態(tài)發(fā)生改變,成為了游離態(tài),類(lèi)似用jdbc取出Object之后close了connection,這樣對(duì)象與數(shù)據(jù)庫(kù)就脫離了,也就是游離。歡迎大家來(lái)拍磚^_^