最近在配置 Structs, spring 和hibernate整合的問(wèn)題:開(kāi)啟OpenSessionInViewFilter來(lái)阻止延遲加載的錯(cuò)誤的時(shí)候拋出了這個(gè)異常: org.springframework.dao.InvalidDataAccessApiUsageException錯(cuò)誤但是在我們開(kāi)啟OpenSessionInViewFilter這個(gè)過(guò)濾器的時(shí)候FlushMode就已經(jīng)被默認(rèn)設(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;
首先說(shuō)一個(gè)最直接明了的方法,在XXXServiceImpl類(lèi)上加注解:@Transactional?? --基本上加了問(wèn)題就解決了,如果解決不了,再看下面這類(lèi)啰里啰嗦的方法試試
解決辦法1: 直接修改OpenSessionInViewFilter過(guò)濾器的配置,配置過(guò)濾器的時(shí)候配置就是在一般的配置里面加上下面藍(lán)色部分就可以了,直接指定flushMode的配置就OK了:下面是配置文件:(web.xml)[html] view plain copyOpenSessionInViewFilterorg.springframework.orm.hibernate3.support.OpenSessionInViewFilterflushModeAUTOOpenSessionInViewFilter/*
解決方法2: 就是配置事務(wù)的邊界,在你方法的執(zhí)行時(shí)配置事務(wù)邊界!下面是sessionFactor.xml配置:[html] view plain copy
下面是總結(jié):原理:因?yàn)榕渲胦penSessionInView時(shí),啟動(dòng)后他默認(rèn)是給沒(méi)有配置事務(wù)邊界的方法都默認(rèn)為只讀的,所以在插入數(shù)據(jù)時(shí)就會(huì)報(bào)上面的錯(cuò)