在Myeclipse 8.6写一个基于SSH的应用时遇到如下问题:

    在JUint中写UserDAOImpl的txsaveNewUser方法测试时,执行一切正常,可是查看mysql数据库中是一片空白,数据并没有插入到数据库中。UserDAOImpl用的是HibernateTemplate的save方法,应当是没什么问题的,最终发现是如下问题所致:

    Spring对声明式事务的支持配置。

    之前为了业务逻辑处理的连贯性,将事务管理配置在了service层,如下:

<!-- TransactionManager配置 -->
 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"/>
 </bean>
 
 <!-- 声明式事务配置 -->
 <tx:advice id="txadvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="tx*" propagation="REQUIRED"/>
   <tx:method name="*" read-only="true"/>
  </tx:attributes>
 </tx:advice>
 
 <!-- 声明式事务AOP配置 -->
 <aop:config>
  <aop:pointcut id="allservice" expression="execution(public * fanfan.service..*(..))"/>
  <aop:advisor advice-ref="txadvice" pointcut-ref="allservice"/>
 </aop:config>

可是这次测试是在DAOImpl层开展的,故没有将此纳入事务管理,出现了问题。

解决办法:

    将DAOImpl层也配置进事务的管理,具体配置如下:

 <!-- TransactionManager配置 -->
 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"/>
 </bean>
 
 <!-- 声明式事务配置 -->
 <tx:advice id="txadvice" transaction-manager="transactionManager">
  <tx:attributes>
   <tx:method name="tx*" propagation="REQUIRED"/>
   <tx:method name="*" read-only="true"/>
  </tx:attributes>
 </tx:advice>
 
 <!-- 声明式事务AOP配置 -->
 <aop:config>
  <aop:pointcut id="allservice" expression="execution( public * fanfan.service..*(..))"/>
  <aop:pointcut id="daomethods" expression="execution( public * fanfan.DAOImpl..*(..))"/>
  <aop:advisor advice-ref="txadvice" pointcut-ref="allservice"/>
  <aop:advisor advice-ref="txadvice" pointcut-ref="daomethods"/>
 </aop:config>

这样,在测试DAOImpl时就纳入了事务的管理,测试正常。

在运行阶段,service层就会打开事务,而propagation="REQUIRED"的配置也会保证DAOImpl会用已经开启的事务进行操作,问题得到解决。