<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener
applicationContext-common.xml的配置
XML code
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<aop:config>
<aop:pointcut id="allMethod" expression="execution(* com.xiaobao.basedata.manager.*.*(..))"/>
<aop:advisor advice-ref="transactionAdvice" pointcut-ref="allMethod"/>
</aop:config>
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="upload*" propagation="REQUIRED"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
当我通过DAO层用getHibernateTemplate().save(item);去保存的时候会报 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. 错误,
我到晚上查了下,是因为OpenSessionInViewFilter默认会将session的FlushMode设置成NEVER只读模式导致的
问题来了我不是已经在applicationContext中配置了切入点订阅的哪些joinpoint吗,默认 read-only="false"的不是只读的
既然这样就算OpenSessionInViewFilte会默认设置session的FlushMode值,但是当调用了匹配的方法时transaction会去修改
session的FlushMode的值吗,如果会修改那么save时为什么还会报错呢,
还一个问题,网上很多人说在save前可以手动的去设置FlushMode值,或者通过filter传递参数
XML code
<init-param>
<param-name> flushMode </param-name>
<param-value>AUTO </param-value>
</init-param>
我都试过了第一种去手动设置虽然不会报错,但是没有执行sql语句,数据库当然也不会有
第二种,我也试了直接不起作用依然报错,我看了下filter的源代码,它是直接默认设置的
Java code
protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.setFlushMode(FlushMode.NEVER);
return session;
}
根本就没有根据传递过来的参数值去设置FlushMode这有是怎么回事呢,网上很多人都说这种方法管用
难道是我们spring版本问题?2.0应该也不会有问题吧,还是我的配置有问题,望大侠们指点迷津啊
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<prop key="save*">REQUIRED</prop> ............