最近在配置 Structs, spring 和hibernate整合的问题:开启OpenSessionInViewFilter来阻止延迟加载的错误的时候抛出了这个异常: org.springframework.dao.InvalidDataAccessApiUsageException错误但是在我们开启OpenSessionInViewFilter这个过滤器的时候FlushMode就已经被默认设置为了MANUAL!如果FlushMode是MANUAL或NEVEL,在操作过程中 hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现如下错误: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: 就是配置事务的边界,在你方法的执行时配置事务边界!下面是sessionFactor.xml配置:[html] view plain copy
下面是总结:原理:因为配置openSessionInView时,启动后他默认是给没有配置事务边界的方法都默认为只读的,所以在插入数据时就会报上面的错