最近在配置 Structs, spring 和hibernate整合的問題:開啟OpenSessionInViewFilter來阻止延遲加載的錯誤的時候拋出了這個異常: org.springframework.dao.InvalidDataAccessApiUsageException錯誤但是在我們開啟OpenSessionInViewFilter這個過濾器的時候FlushMode就已經(jīng)被默認設置為了MANUAL劈愚!如果FlushMode是MANUAL或NEVEL,在操作過程中 hibernate會將事務設置為readonly瞳遍,所以在增加、刪除或修改操作過程中會出現(xiàn)如下錯誤: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菌羽;
首先說一個最直接明了的方法掠械,在XXXServiceImpl類上加注解:@Transactional?? --基本上加了問題就解決了,如果解決不了注祖,再看下面這類啰里啰嗦的方法試試
解決辦法1: 直接修改OpenSessionInViewFilter過濾器的配置猾蒂,配置過濾器的時候配置就是在一般的配置里面加上下面藍色部分就可以了,直接指定flushMode的配置就OK了:下面是配置文件:(web.xml)[html] view plain copyOpenSessionInViewFilterorg.springframework.orm.hibernate3.support.OpenSessionInViewFilterflushModeAUTOOpenSessionInViewFilter/*
解決方法2: 就是配置事務的邊界是晨,在你方法的執(zhí)行時配置事務邊界肚菠!下面是sessionFactor.xml配置:[html] view plain copy
下面是總結(jié):原理:因為配置openSessionInView時,啟動后他默認是給沒有配置事務邊界的方法都默認為只讀的罩缴,所以在插入數(shù)據(jù)時就會報上面的錯