参考了网上的一些例子,采用了动态创建transition的方式,进行回退,逻辑处理没有问题,而且在程序运行中打印了TASK的ID 和 NAME ,HIBERNATE 也打印了相应的UPDATE SQL ,但在数据库jbpm4_task 中还是以前的节点,并没有把回退后的节点更新到数据库。  /**
  * 动态创建连接当前任务节点至名称为destName的节点的Transition
  * @param taskId 当前任务节点 (审批)
  * @param sourceName 源节点名称 (审批)
  * @param destName  目标节点名称 (提交)
  */
 public void addOutTransition(Task task,String sourceName,String destName){
 
 //业务场景:张三提交单据到李四审批,李四进行驳回给张三。采用动态创建连接当前任务节点方式。
 
 // 当前节点: 审批     需要回退到:提交
 ExecutionImpl e = (ExecutionImpl)executionService.findExecutionById(task.getId());
 ActivityImpl sourceActivity = e.getActivity();//当前任务节点
 ProcessDefinitionImpl processDefinitionImpl = sourceActivity.getProcessDefinition(); 
 ActivityImpl destActivityImpl = processDefinitionImpl.findActivity(destName); //根据目标点名称获取目标节点
 try { 
 //为两个节点创建连接
 TransitionImpl transition = sourceActivity.createOutgoingTransition();  
 transition.setName("");
 transition.setDestination(destActivityImpl);
 sourceActivity.addOutgoingTransition(transition);   
 Map map = new HashMap();
   map.put("sqr", "zhangsan"); //设置提交人为张三
       taskService.setVariables(task.getId(), map);  
 taskService.completeTask(task.getId(),"");     
 List<ProcessInstance> piList1 = executionService.createProcessInstanceQuery().list();  
           for(ProcessInstance pi : piList1){           
              System.out.println(pi.findActiveActivityNames());     //打印出来当前激活节点为 “提交”         
           }          
         List<Task> johndoetaskList1 = taskService.findPersonalTasks("zhangsan"); //查询张三的待办记录         
         for(Task t1:johndoetaskList1){     
        System.out.println(t1.getId()+"\t"+t1.getName()+"\t"+t1.getAssignee()); //能够打印出刚才回退给张三的节点信息,问题:但在数据库表jbpm4_task中还是李四的节点。
          }                 
 }catch(Exception ex){
  ex.printStackTrace();
 }
 
 }