Posted on 2009-11-25 22:55
landor 閱讀(5028)
評(píng)論(0) 編輯 收藏 所屬分類:
hibernate
參見hibernate的api說(shuō)明
https://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html
說(shuō)明FlushMode有五種屬性
1
NEVEL
已經(jīng)廢棄了,被MANUAL取代了
2 MANUAL
spring3.x中的opensessioninviewfilter已經(jīng)將默認(rèn)的FlushMode設(shè)置為MANUAL了;
如果FlushMode是MANUAL或NEVEL,在操作過(guò)程中hibernate會(huì)將事務(wù)設(shè)置為readonly,所以在增加、刪除或修改操作過(guò)程中會(huì)出現(xiàn)如下錯(cuò)誤
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition;
解決辦法網(wǎng)上有很多;
1 配置事務(wù),spring會(huì)讀取事務(wù)中的各種配置來(lái)覆蓋hibernate的session中的FlushMode;
2 先編程式修改FlushMode,比如session.setFlushMode(FlushMode.AUTO); 這樣hibernate就會(huì)自動(dòng)去除readonly限制;
3 直接修改opensessioninviewfilter過(guò)濾器的配置,配置過(guò)濾器的時(shí)候配置
<filter>
<filter-name>openSession</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
3 AUTO
設(shè)置成auto之后,當(dāng)程序進(jìn)行查詢、提交事務(wù)或者調(diào)用session.flush()的時(shí)候,都會(huì)使緩存和數(shù)據(jù)庫(kù)進(jìn)行同步,也就是刷新數(shù)據(jù)庫(kù)
4 COMMIT
提交事務(wù)或者session.flush()時(shí),刷新數(shù)據(jù)庫(kù);查詢不刷新
5 ALWAYS
每次進(jìn)行查詢、提交事務(wù)、session.flush()的時(shí)候都會(huì)刷數(shù)據(jù)庫(kù)
這里需要說(shuō)一下和AUTO的區(qū)別,當(dāng)hibernate緩存中的對(duì)象被改動(dòng)之后,會(huì)被標(biāo)記為臟數(shù)據(jù)(即與數(shù)據(jù)庫(kù)不同步了)。當(dāng)session設(shè)置為FlushMode.AUTO時(shí),hibernate在進(jìn)行查詢的時(shí)候會(huì)判斷緩存中的數(shù)據(jù)是否為臟數(shù)據(jù),是則刷數(shù)據(jù)庫(kù),不是則不刷,而always是直接刷新,不進(jìn)行任何判斷。很顯然auto比always要高效得多。