如果在Spring(beans.xml)里沒有配置事務,在web.xml配置了openSessionInView,然后調用了save方法,openSessionInView認為這個方法為只讀。
如果配置文件(beans.xml)里沒有配置事務邊界,openSessionInView攔截到的任何方法的Session都認為是只讀的。
openSessionInViewFilter
<filter>
<filter-name>OpenSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> 注意加在struts2 filter之前。
解決方法:配置事務
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<aop:config>
<aop:pointcut expression="execution(public * com.bebig.userregister.service..*.*(..))"
id="servicePointcut" />
<aop:advisor advice-ref="txAdvisor" pointcut-ref="servicePointcut" />
</aop:config>
<tx:advice id="txAdvisor" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="exists" read-only="true" />
<tx:method name="add*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
