我是一个spring 学习的初手, 在学习spring in action这本书的 事务自动代理 章节时,按照所说的方式,我先配置了一个自动代理和事务属性源advisor,如下:
<bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"> </bean> <bean id="transactionAdvisor" class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> <constructor-arg> <ref bean="tranInterceptor" /> </constructor-arg> </bean>
<bean id="tranInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"> <ref bean="hibernateTranManager" /> </property> <property name="transactionAttributeSource"> <ref bean="tranAttribute1" /> </property> </bean>
而后,我配置属性源,书上说有两种方式位自动代理选择一个属性源
一:
<bean id="tranAttribute1" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"> <property name="properties"> <props> <prop key="insertPerson"> PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-PersonException </prop> </props> </property> </bean>
在我的测试代码中,事务是可以回滚的,也就是说,-PersonException是起作用的,测试代码我贴上部分
public void insertPerson(final Person p) throws PersonException{ getHibernateTemplate().save(p); throw new PersonException(); }
但是,当我按照第二种方式配置属性源,则,没有预期的产生事务回滚:
<bean id="tranAttribute2" class="org.springframework.transaction.interceptor.MethodMapTransactionAttributeSource"> <property name="methodMap"> <map> <entry key="com.dao.PersonDao1.insertPerson"> <value> PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-PersonException </value> </entry> </map> </property> </bean>
PS:用第二种属性源测试的时候,我上述拦截器tranInterceptor的transactionAttributeSource我换成了tranAttribute2的。
期望达人能帮小弟解决这个学习上的疑惑
谢谢
PS:此问题已经解决
问题的原因是:
<entry key="com.dao.PersonDao1.insertPerson">
<value>
PROPAGATION_REQUIRES_NEW,ISOLATION_REPEATABLE_READ,-PersonException </value>
</entry>
中的 <entry key="com.dao.PersonDao1.insertPerson">中的 key属性要是接口,而不是实际类