如何在Spring MVC和Hibernate中的单个事务中从服务层管理对DAO的两个方法调用

时间:2017-02-01 11:29:11

标签: java hibernate spring-mvc

在方法的服务层类中,我调用了删除方法和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> 

任何人都可以帮我解决这个问题。非常感谢提前。

2 个答案:

答案 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就足够了。除非您希望某些方法具有不同的事务类型,否则请写入该方法。