在方法的服务层类中,我调用了删除方法和DAO层的插入方法,如下所示。
服务类:
@Service("workflowService")
@Transactional
public class WorkFlowServiceImpl implements WorkFlowService {
@Autowired
WorkFlowDao workFlowDao;
public String deleteSelectedTask(String strWorkFlowName, int intIndex) {
JSONObject res = new JSONObject();
try{
List<WorkflowPermission> listWorkflowPermission = workFlowDao.getWorkFlowPermissionByName(strWorkFlowName);
listWorkflowPermission.remove(intIndex-1);
boolean flag = workFlowDao.deleteWorkFlowPermissionByName(strWorkFlowName);
for(int i =0;i<listWorkflowPermission.size();i++){
listWorkflowPermission.get(i).setOrderNo(i+1);
flag = workFlowDao.createWorkFlowPermission(listWorkflowPermission.get(i));
}
if(flag==true){
res.put("status", "Success");
res.put("message", "Task Deleted Successfully");
}else{
res.put("status", "Fail");
res.put("message", "Cannot Delete Task");
}
}catch (Exception e) {
logger.error(e);
}
return res.toString();
}
}
首先,我从DAO获取一个列表并删除该表上的条目并使用for循环我通过调用setOrderNO
更改顺序来插入新记录。
DAO课程:
@Repository("workflowDao")
public class WorkFlowDaoImpl implements WorkFlowDao {
@Autowired
private SessionFactory sessionFactory;
private Session session;
@Override
public boolean deleteWorkFlowPermissionByName(String strWorkFlowName) {
try{
session = sessionFactory.getCurrentSession();
SQLQuery sqlQuery= session.createSQLQuery("DELETE FROM UPS_ESC_WTL WHERE workflow_name='"+strWorkFlowName+"'");
sqlQuery.executeUpdate();
session.flush();
return true;
}catch(Exception e){
e.printStackTrace();
}
return false;
}
public boolean createWorkFlowPermission(
WorkflowPermission workFlowPermission) {
boolean blStatus = false;
try {
session = sessionFactory.getCurrentSession();
session.saveOrUpdate(workFlowPermission);
session.flush();
blStatus = true;
} catch (Exception e) {
logger.error(e);
throw new DataAccessException();
}
return blStatus;
}
}
在调试代码时,我正在获取列表表单数据库,并且表中的所有记录都将被删除。迭代列表时,它正确地通过插入记录的方法。但它没有反映在数据库中。 我想为此处理带有回滚的事务并将记录插入到db。我还在applicationContext.xml
中添加了HibernateTransactionManager
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
任何人都可以帮我解决这个问题。非常感谢提前。
答案 0 :(得分:2)
将注释@Transactional添加到共享同一数据库事务所需的所有方法,然后回滚将应用于所有操作。
实施例
public class ServiceFirstImpl
@Autowired
FirstDao firstDao;
@Autowired
SecondDao secondDao;
@Transactional
public void mixActions(){
firstDao.delete();
secondDao.create();
}
答案 1 :(得分:0)
您的一个问题是deleteWorkFlowPermissionByName方法
}catch(Exception e){
e.printStackTrace();
}
如果方法抛出RuntimeException或声明异常,那么Spring Transaction将执行回滚。 现在,如果deleteWorkFlowPermissionByName方法中存在异常,则代码不会触发回滚。
在你的情况下,在课堂上有@Transactional就足够了。除非您希望某些方法具有不同的事务类型,否则请写入该方法。