我是一个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属性要是接口,而不是实际类