今天遇到的问题如下:
oa项目中,使用到了Spring的AOP对Manager Layer的CUD操作进行了声明式事务管理,相关代码如下:
<!-- 配置事务的传播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager" > <tx:attributes> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 配置哪些类哪些方法使用事务 --> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution(* com.hiaward.oa.manager.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/> </aop:config>
之前测试过一个OrganizationManagerImpl时CUD操作都是成功的。但今天在测试一个新的Manager Layer PersonManagerImpl的时候,却出现了如下的情况:
Hibernate: insert into T_Person (name, sex, age, address, duty, phone, org_id) values (?, ?, ?, ?, ?, ?, ?)
但对应的表 t_person 里边却没有这条记录,当时第一反映就是事务的问题,于是返回头去测试了下原来 OrganizationManagerImpl的add*方法,居然也是同样的情况,这叫我有点迷,为什么呢?肯定是自己在这中间改了什么设置,是什么呢? 噢,当我看到<aop:pointcut id="allManagerMethod" expression="execution(* com.hiaward.oa.manager.*.*(..))"/>这句时,一下子想到了,由于一开始的设计问题,我曾对Manager Layer的包名进行了重构,把原来的包名 com.hiaward.oa.manager 重构为 现在的 com.hiaward.oa.managers, 而配置文件中的相关部分却忘记了重构,所以导致了这个问题。于是按照想法改了过来,重新测试2个 *ManagerImpl,均成功通过。
总结:当遇到这个问题的时候,一开始定位到了是事务的问题,后来依次寻源,终于找到症结。