(FlushMode.NEVER/MANUAL): Turn your Session into
文章分類:Java編程
org.springframework.dao.InvalidDataAccessApiUsageException: Write
operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL):
Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly'
marker from transaction definition.
執行這個方法得時候 出錯了getHibernateTemplate().save(agentLog);
錯誤原因:
OpenSessionInViewFilter在getSession的時候,會把獲取回來的session的flush mode
設爲FlushMode.NEVER。然後把該sessionFactory綁定到
TransactionSynchronizationManager,使request的整個過程都使用同一個session,在請求過後再接除該
sessionFactory的綁定,最後closeSessionIfNecessary根據該session是否已和transaction綁定來決
定是否關閉session。在這個過程中,若HibernateTemplate
發現自當前session有不是readOnly的transaction,就會獲取到FlushMode.AUTO
Session,使方法擁有寫權限。
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER轉爲Flush.AUTO,擁有
insert,update,delete操作權限,如果沒有transaction,並且沒有另外人爲地設flush
model的話,則doFilter的整個過程都是Flush.NEVER。所以受transaction保護的方法有寫權限,沒受保護的則沒有。