以下有个办法,可是在用的时候出问题了,第一,getBean()的时候,这个方法没法直接用啊,我是BeanFactoryUtil.getBean()这样用的,第二,getBean()得到的是HibernateTransactionManager,转不成DataSourceTransactionManager ,怎么办,我Spring中配置的是:org.springframework.orm.hibernate3.HibernateTransactionManager,可是这是遗留问题,不能改成DataSourceTransactionManager ,有没有解决办法呢?谢谢public interface ITransactionManager {
/**
 * 该方法中是需要进行事务控制的内容
 * @return
 * @throws Exception
 */
Object doInTransaction() throws Exception;
}
public class DataSourceTransactionUtil {
public Object execute(final ITransactionManager transactionManager){
DataSourceTransactionManager dataSourceTransactionManager = getDataSourceTransactionManager();
TransactionTemplate transactionTemplate = new TransactionTemplate(dataSourceTransactionManager);
return transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus transactionStatus) {
Object savepoint = transactionStatus.createSavepoint();
Object result = null;
try{
result = transactionManager.doInTransaction();
} catch(Exception e){
transactionStatus.rollbackToSavepoint(savepoint);
e.printStackTrace();
} finally{
transactionStatus.releaseSavepoint(savepoint);
}
return result;
}
});
} private DataSourceTransactionManager getDataSourceTransactionManager(){
return (DataSourceTransactionManager)getBean("transactionManager");
}
}
解释一下:
这段代码我记得是看了spring源码后自己写的。
1、getBean("transactionManager");是获得spring中事务管理器那个bean,你自己改名字。
2、把这段代码放到你的BaseAction中:
protected Object beginTransaction(ITransactionManager transactionManagerImpl){
DataSourceTransactionUtil dt = new DataSourceTransactionUtil();
return dt.execute(transactionManagerImpl);
}
3.在你需要开启事务的action中调用beginTransaction方法transactionManagerImpl这个对象你写个匿名内部类然后实现doInTransaction() 方法,在doInTransaction() 中去写你调用多个service的代码