如果在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>