我的SSH项目之旅(11.Spring事务解决Session)

2008年12月21日 JAVA 暂无评论

关于spring事务配置

这个问题从一开始困扰了我很久,主要是因为使用HibernateTemplate的时候发生'readOnly的问题。之前查了很多资料,都说用spring事务配置可以解决,但之前我都一直没成功。昨天一试,有效果了。

 

 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource"/>

    </bean>

 

 

    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">

       <!-- 事务拦截器bean需要依赖注入一个事务管理器 -->

       <property name="transactionManager" ref="transactionManager"/>

       <property name="transactionAttributes">

           <!--  下面定义事务传播属性-->

           <props>

              <prop key="*">PROPAGATION_REQUIRED</prop>

           </props>

       </property>

    </bean>

 

    <!-- 定义BeanNameAutoProxyCreator-->

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

    <!-- 指定对满足哪些bean namebean自动生成业务代理 -->

        <property name="beanNames">

            <!-- 下面是所有需要自动创建事务代理的bean-->

            <list>

                <value>consumerdaoimpl</value>

            </list>

            <!-- 此处可增加其他需要自动创建事务代理的bean-->

        </property>

        <!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->

        <property name="interceptorNames">

            <list>

                <value>transactionInterceptor</value>

                <!-- 此处可增加其他新的Interceptor -->

            </list>

        </property>

</bean>

注:PROPAGATION_REQUIRED表示在目前的事务中执行操作,如果事务不存在就建立一个新的事务

这种配置用的是BeanNameAutoProxyCreate创建代理,但它不一定是创建事务代理,关键在传入的拦截器,如果传入的是事务拦截器,将可自动生成事务代理。如果有更多目标的bean需要自动创建事务代理则可以感受到这种配置的优势,因为只需简单增加一行就可以了。

这样配置之后解决了我之前那些关于session引发的很多问题。

网上说,使用HibernateTemplate操作才能参与到spring事务,而用getSession()拿到Session操作的则没有,有时候我用的时候总发现插入不了数据等问题,似乎是因为事务提交问题。

新的发现

以前写的代码中有时候用getSession().save()方法总出现没报错但又插入不了数据,一开始我总以为是什么包冲突。原来是没事务提交,这点我应该早猜到才是的。

getHibernateTemplate().save(o)这种方法已经交给spring去处理事务提交了,所以可以直接使用,而用getSession().save()就要注意手动提交事务。

    public void insert(Object o) throws Exception {

        Session session = this.getSession();

       Transaction t = session.beginTransaction();

       session.save(o);

       t.commit();

       // this.getHibernateTemplate().save(o);

    }

对这个相关问题的认识在进一步加深中,以后有空要去看看相关资料才行

给我留言