Spring中OpenSessionInViewFilter设置FlushMode为NEVER的问题

吉他猪 2012-08-01 01:30:00
web.xml中的配置

<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的配置

<!-- 配置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传递参数

<init-param>
<param-name> flushMode </param-name>
<param-value>AUTO </param-value>
</init-param>

我都试过了第一种去手动设置虽然不会报错,但是没有执行sql语句,数据库当然也不会有
第二种,我也试了直接不起作用依然报错,我看了下filter的源代码,它是直接默认设置的

protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
session.setFlushMode(FlushMode.NEVER);
return session;
}

根本就没有根据传递过来的参数值去设置FlushMode这有是怎么回事呢,网上很多人都说这种方法管用
难道是我们spring版本问题?2.0应该也不会有问题吧,还是我的配置有问题,望大侠们指点迷津啊
...全文
274 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
请问楼主 applicationContext-common.xml是如何配置的 能发一份给我吗 我是初学者 1354655966@qq.com 多谢多谢
吉他猪 2012-08-01
  • 打赏
  • 举报
回复
知道哪里错了,expression="execution(* com.xiaobao.basedata.manager.*.*(..))"配置错了,谢谢了就你一个人回复了我的,分都给你了
吉他猪 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<prop key="save*">REQUIRED</prop>
............
[/Quote]
怎么没有<prop key="save*">REQUIRED</prop>
属性啊。没提示
brightyq 2012-08-01
  • 打赏
  • 举报
回复
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<prop key="save*">REQUIRED</prop>
............

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧