最近学习spring的aop声明式事务管理,发现一个奇怪的问题,xml部分配置贴出来:
<tx:advice id="hibernateAdvice">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut expression="execution(* com.bjsxt.drp.basedata.Manager.ItemManager.*(..))" id="hibernatePointcut"/>
<aop:advisor advice-ref="hibernateAdvice" pointcut-ref="hibernatePointcut"/>
</aop:config>ItemManager中的add方法:   public void addItem(Item item) { getHibernateTemplate().save(item); 
                        // throw new RuntimeException(); }测试发现事务的自动开启和提交没问题,但如果显式的抛出运行时异常,item的插入数据不会自动回滚,纠结了好几个小时,尝试过许多方法都无效,百思不得其解啊

解决方案 »

  1.   

    这个地方错了:<aop:pointcut expression="execution(* com.bjsxt.drp.basedata.Manager.ItemManager.*(..))" id="hibernatePointcut"/>ItemManager.* 后面少了一个.* 要这样:<aop:pointcut expression="execution(* com.bjsxt.drp.basedata.Manager.ItemManager.*.*(..))" id="hibernatePointcut"/>
      

  2.   

    那个地方没错啊 ItemManager不是包 而是类
      

  3.   

    你上面大概的意思就是出现异常事物无法回滚吧。
    上面的配置应该没有错误,我想到了一种可能,就是ItemManager你没有交给spring管理,也就是说你在使用这个类型的时候,ItemManager的初始化工作你是手动new的,而不是采用内部机制初始化的,这样你的事物是不起作用的。
      

  4.   

    应该是这个问题, 你要把事务交给Spring管理那么你的bean就应该由Spring去创建