关于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 name的bean自动生成业务代理 -->
<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);
}
对这个相关问题的认识在进一步加深中,以后有空要去看看相关资料才行