在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会用已经开启的事务进行操作,问题得到解决。