工作流Activiti異常積累

1、部署時生成流程圖異常:Could not load image for process diagram creation: Can't create cache file

Activiti在Linux系統上部署流程時報以下錯誤:

[org.activiti.image.impl.DefaultProcessDiagramCanvas.initialize(DefaultProcessDiagramCanvas.java:245)]
Could not load image for process diagram creation: Can't create cache file!
 [WARN ][2019/01/09 18:06:06346][org.activiti.engine.impl.bpmn.deployer.BpmnDeployer.deploy(BpmnDeployer.java:160)]
Error while generating process diagram, image will not be stored in repository
 java.lang.NullPointerException
    at org.activiti.image.impl.DefaultProcessDiagramCanvas.drawTask(DefaultProcessDiagramCanvas.java:663)
    at org.activiti.image.impl.DefaultProcessDiagramCanvas.drawUserTask(DefaultProcessDiagramCanvas.java:826)
    at org.activiti.image.impl.DefaultProcessDiagramGenerator$6.draw(DefaultProcessDiagramGenerator.java:185)
    at org.activiti.image.impl.DefaultProcessDiagramGenerator.drawActivity(DefaultProcessDiagramGenerator.java:587)
    at org.activiti.image.impl.DefaultProcessDiagramGenerator.generateProcessDiagram(DefaultProcessDiagramGenerator.java:494)
    at org.activiti.image.impl.DefaultProcessDiagramGenerator.generateDiagram(DefaultProcessDiagramGenerator.java:403)
    at org.activiti.image.impl.DefaultProcessDiagramGenerator.generateDiagram(DefaultProcessDiagramGenerator.java:425)
    at org.activiti.engine.impl.bpmn.deployer.BpmnDeployer.deploy(BpmnDeployer.java:155)
    at org.activiti.engine.impl.persistence.deploy.DeploymentManager.deploy(DeploymentManager.java:58)
    at org.activiti.engine.impl.cmd.DeployCmd.execute(DeployCmd.java:106)
    at org.activiti.engine.impl.cmd.DeployCmd.execute(DeployCmd.java:37)
    at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
    at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
    at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
    at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
    at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:37)
    at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
    at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
    at org.activiti.engine.impl.RepositoryServiceImpl.deploy(RepositoryServiceImpl.java:79)
    at org.activiti.engine.impl.repository.DeploymentBuilderImpl.deploy(DeploymentBuilderImpl.java:156)
    at net.northking.service.impl.activiti.ModelServiceImpl.deploy(ModelServiceImpl.java:76)
    at net.northking.controller.activiti.ModelController.deployByModelId(ModelController.java:171)
    at net.northking.controller.activiti.ModelController.deploy(ModelController.java:108)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

並且生成流程圖失敗,從報錯信息可以看到是DefaultProcessDiagramCanvas.java的663行導致,進去後(位於activiti-image-generator-5.22.0.jar包的org.activiti.image.impl下)發現這是這行報空指針:

method_drawTask.png

從這裏不難猜測是icon爲空,再查找該方法的引用處:drawUserTask方法:

method_drawUserTask.png

再看USERTASK_IMAGE的賦值的地方:

method_initialize.png

可以看到正是這裏拋出的異常,錯誤信息是 Can't create cache file!查看ImageIO源代碼發現其中使用了一個緩衝區,在使用ImageIO進行圖片讀寫操作時,Linux默認會使用緩存目錄:${tomcat}/temp,在此緩存目錄會生成緩存文件imageio4138671232726624650.tmp(這一串數字應該是當前時間戳,臨時文件名),有些生產或測試環境的tomcat,會將temp目錄刪除,因此報錯Can't create cache file! 其實已經說得很明顯,緩衝區文件無法創建,找到緩衝區目錄看一下即可找到原因,目錄不存在、目錄不可寫等等。

4種解決方法如下

  1. 在tomcat下新建temp目錄;

  2. 與方法1相似,通過ImageIO.setCacheDirectory(cacheDirectory);設置任意的、存在的緩存目錄

  3. ImageIO默認是使用緩存目錄,可以通過ImageIO.setUseCache(false)來設置,更改緩存策略,不使用文件目錄緩存,使用內存緩存

  4. 不使用ImageIO,換成其它JDK方法
    ImageIO.write(bi, "jpg", baos);
    換成:
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
    encoder.encode(image);

解決方案摘自:https://blog.csdn.net/cwfreebird/article/details/51820993

2、ActivitiWrongDbException: version mismatch: activiti library version is '5.22.0.0', db version is null Hint

Activiti配置時,導入數據表的創建sql文件後,啓動項目,報以下錯誤:

Caused by: org.activiti.engine.ActivitiWrongDbException: version mismatch: activiti library version is '5.22.0.0', db version is null Hint: Set <property name="databaseSchemaUpdate" to value="true" or value="create-drop" (use create-drop for testing only!) in bean processEngineConfiguration in activiti.cfg.xml for automatic schema creation
    at org.activiti.engine.impl.db.DbSqlSession.dbSchemaCheckVersion(DbSqlSession.java:920)
    at org.activiti.engine.impl.db.DbSqlSession.performSchemaOperationsProcessEngineBuild(DbSqlSession.java:1419)
    at org.activiti.engine.impl.SchemaOperationsProcessEngineBuild.execute(SchemaOperationsProcessEngineBuild.java:27)
    at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
    at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
    at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
    at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
    at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
    at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
    at org.activiti.engine.impl.ProcessEngineImpl.<init>(ProcessEngineImpl.java:80)
    at org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl.buildProcessEngine(ProcessEngineConfigurationImpl.java:613)
    at org.activiti.spring.SpringProcessEngineConfiguration.buildProcessEngine(SpringProcessEngineConfiguration.java:65)
    at org.activiti.spring.ProcessEngineFactoryBean.getObject(ProcessEngineFactoryBean.java:60)
    at org.activiti.spring.ProcessEngineFactoryBean.getObject(ProcessEngineFactoryBean.java:32)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
    ... 41 more

這個是由於數據庫內的版本跟實際的版本不匹配導致的(ACT_GE_PROPERTY表),我這是由於導數據的時候該表數據部分未導入成功,導致一直報改錯誤,我的pom.xml中的activiti 版本爲 5.22.0.0,而是數據表ACT_GE_PROPERTY中爲null:

image.png

該表插入以下數據即可。

INSERT INTO `act_ge_property` VALUES ('next.dbid', '1', 1);
INSERT INTO `act_ge_property` VALUES ('schema.history', 'create(5.22.0.0)', '1');
INSERT INTO `act_ge_property` VALUES ('schema.version', '5.22.0.0', '1');

其中的5.22.00與pom.xml中的activiti的版本保持一致。
sql表數據如下:

image.png

3、no resource found with name '需求提交流程模型.requirementConfirmProcess.png' in deployment '180001'

現象:點擊流程圖,圖片加載失敗,後臺日誌爲:

 

 org.activiti.engine.ActivitiObjectNotFoundException: no resource found with name '需求提交流程模型.requirementConfirmProcess.png' in deployment '180001'
    at org.activiti.engine.impl.cmd.GetDeploymentResourceCmd.execute(GetDeploymentResourceCmd.java:58)
    at org.activiti.engine.impl.cmd.GetDeploymentResourceCmd.execute(GetDeploymentResourceCmd.java:30)
    at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
    at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
    at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
    at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
    at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:37)
    at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
    at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
    at org.activiti.engine.impl.RepositoryServiceImpl.getResourceAsStream(RepositoryServiceImpl.java:113)
    at net.northking.activiti.service.ProcessService.getDiagramByProDefinitionId_noTrace(ProcessService.java:435)
    at net.northking.activiti.controller.ProcessController.loadByDeployment(ProcessController.java:749)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)

調用方法 net.northking.activiti.service.ProcessService.javagetDiagramByProDefinitionId_noTrace方法:

public InputStream getDiagramByProDefinitionId_noTrace(String resourceType, String deploymentId) throws Exception {
        ProcessDefinition processDefinition = findProcessDefinitionByDeploymentId(deploymentId);
        String resourceName = "";
        if (resourceType.equals("png") || resourceType.equals("image")) {
            resourceName = processDefinition.getDiagramResourceName();
        } else if (resourceType.equals("xml")) {
            resourceName = processDefinition.getResourceName();
        }
        InputStream resourceAsStream = null;
        if (StringUtil.isNotEmpty(resourceName)) {
            resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
        }
        return resourceAsStream;
    }

繼續往下走,org.activiti.engine.impl.RepositoryServiceImpl.java

  public InputStream getResourceAsStream(String deploymentId, String resourceName) {
    return commandExecutor.execute(new GetDeploymentResourceCmd(deploymentId, resourceName));
  }
  

最後在org.activiti.engine.impl.cmd.GetDeploymentResourceCmd.java的execute方法拋出異常:

  public InputStream execute(CommandContext commandContext) {
    if (deploymentId == null) {
      throw new ActivitiIllegalArgumentException("deploymentId is null");
    }
    if(resourceName == null) {
      throw new ActivitiIllegalArgumentException("resourceName is null");
    }
    
    ResourceEntity resource = commandContext
      .getResourceEntityManager()
      .findResourceByDeploymentIdAndResourceName(deploymentId, resourceName);
    if(resource == null) {
      if(commandContext.getDeploymentEntityManager().findDeploymentById(deploymentId) == null) {
        throw new ActivitiObjectNotFoundException("deployment does not exist: " + deploymentId, Deployment.class);
      }
      else
      {
        throw new ActivitiObjectNotFoundException("no resource found with name '" + resourceName + "' in deployment '" + deploymentId + "'", InputStream.class);
      }
    }
    return new ByteArrayInputStream(resource.getBytes());
  }

場景重現並分析:(可以在這時,即先啓動服務,再執行init流程模型相關sql文件)在數據庫已有流程且未部署,且act_ge_property表中的next.dbid爲180001;如下圖:

image.png

(也可以在這時,啓動服務,再部署流程,如果前一個步驟執行完畢沒有操作過流程則不用在此處重啓服務)部署(任何)一個流程,此時該流程的部署id一定爲180001(不清楚原因的話可以詳看 上一篇:Spring學習之整合Activiti(三)之Id生成 ),並會往act_ge_bytearray表插入兩條180002、180003的數據:

image.png

然後執行一個新增流程的sql文件:

image.png

執行完成後數據表如下:

image.png

可以看到act_ge_bytearray中,新增流程模型的180002、180003覆蓋了之前部署的流程的180002、180003信息,所以導致獲取act_ge_bytearray之前的180002、180003流程信息爲null,故拋錯

4、deployment '180001' didn't put process definition 'requirementConfirmProcess:1:180004' in the cache

現象:啓動流程或獲取流程追蹤圖失敗,後臺日誌爲:

Caused by: org.activiti.engine.ActivitiException: deployment '180001' didn't put process definition 'requirementConfirmProcess:1:180004' in the cache
    at org.activiti.engine.impl.persistence.deploy.DeploymentManager.resolveProcessDefinition(DeploymentManager.java:189)
    at org.activiti.engine.impl.persistence.deploy.DeploymentManager.findDeployedProcessDefinitionById(DeploymentManager.java:77)
    at org.activiti.engine.impl.cmd.GetDeploymentProcessDefinitionCmd.execute(GetDeploymentProcessDefinitionCmd.java:39)
    at org.activiti.engine.impl.cmd.GetDeploymentProcessDefinitionCmd.execute(GetDeploymentProcessDefinitionCmd.java:26)
    at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
    at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
    at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
    at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
    at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:37)
    at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
    at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
    at org.activiti.engine.impl.RepositoryServiceImpl.getDeployedProcessDefinition(RepositoryServiceImpl.java:139)
    at net.northking.activiti.util.ProcessDefinitionCache.getProcessDefination(ProcessDefinitionCache.java:81)
    at net.northking.activiti.service.ProcessService.getActivitiProccessImage(ProcessService.java:464)
    ... 42 more

啓動流程和獲取流程追蹤圖都是在net.northking.activiti.util.ProcessDefinitionCache.java的getProcessDefination方法拋錯,該方法代碼爲:

    public ProcessDefinition getProcessDefination(String processDefinitionId) {
        ProcessDefinition processDefinition = map.get(processDefinitionId);

        if (processDefinition == null) {
            if (null == repositoryService) {
                repositoryService = ApplicationContextHandler.getBean(RepositoryService.class);
            }
            processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
                    .getDeployedProcessDefinition(processDefinitionId);
            if (processDefinition != null) {
                put(processDefinitionId, processDefinition);
            }
        }
        return processDefinition;
    }

跟蹤代碼,可以看到,拋錯的地方爲:
org.activiti.engine.impl.persistence.deploy.DeploymentManager.java中的resolveProcessDefinition方法:

  public ProcessDefinitionEntity resolveProcessDefinition(ProcessDefinitionEntity processDefinition) {
    String processDefinitionId = processDefinition.getId();
    String deploymentId = processDefinition.getDeploymentId();
    processDefinition = processDefinitionCache.get(processDefinitionId);
    if (processDefinition==null) {
      DeploymentEntity deployment = Context
        .getCommandContext()
        .getDeploymentEntityManager()
        .findDeploymentById(deploymentId);
      deployment.setNew(false);
      deploy(deployment, null);
      processDefinition = processDefinitionCache.get(processDefinitionId);
      
      if (processDefinition==null) {
        throw new ActivitiException("deployment '"+deploymentId+"' didn't put process definition '"+processDefinitionId+"' in the cache");
      }
    }
    return processDefinition;
  }
  

場景重現及分析:
場景類似問題3
1、部署已有流程,
2、然後運行新增流程模型的sql文件,
3、重啓服務(或者先重啓再運行新增流程模型的sql文件);
4、啓動已部署的流程,報:

 org.activiti.engine.ActivitiException: deployment '180001' didn't put process definition 'requirementConfirmProcess:1:180004' in the cache
    at org.activiti.engine.impl.persistence.deploy.DeploymentManager.resolveProcessDefinition(DeploymentManager.java:189)
    at org.activiti.engine.impl.persistence.deploy.DeploymentManager.findDeployedProcessDefinitionById(DeploymentManager.java:77)
    at org.activiti.engine.impl.cmd.GetDeploymentProcessDefinitionCmd.execute(GetDeploymentProcessDefinitionCmd.java:39)
    at org.activiti.engine.impl.cmd.GetDeploymentProcessDefinitionCmd.execute(GetDeploymentProcessDefinitionCmd.java:26)
    at org.activiti.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:24)
    at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:57)
    at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
    at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
    at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:37)
    at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
    at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
    at org.activiti.engine.impl.RepositoryServiceImpl.getDeployedProcessDefinition(RepositoryServiceImpl.java:139)
    at net.northking.activiti.util.ProcessDefinitionCache.getProcessDefination(ProcessDefinitionCache.java:81)
    at net.northking.activiti.util.ProcessDefinitionCache.getActivities(ProcessDefinitionCache.java:108)
    at net.northking.activiti.service.CusUserTaskService.initSingleActivitiInfo(CusUserTaskService.java:79)
    at net.northking.activiti.service.CusUserTaskService.initProcessUserTaskInfo(CusUserTaskService.java:64)
    at net.northking.activiti.controller.ProcessController.initUserTaskAssignees(ProcessController.java:415)
    at net.northking.activiti.controller.ProcessController.startProcess(ProcessController.java:376)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)

解決方案
目前的解決方法是:
1、在每插入一條新的流程模型時,先判斷其字段EDITOR_SOURCE_VALUE_ID_(即爲act_ge_bytearray中的ID_ 值)和EDITOR_SOURCE_EXTRA_VALUE_ID_(即爲act_ge_bytearray中的ID_ 值) 在表 act_ge_bytearray中是否存在(因爲不能直接更新外鍵,所以該操作需要去除外鍵),
存在的條件是ID_NAME_都相等:
如果只有ID_相等的話,則ID_的值+3000(這個值是我估算的),代碼如下:


/* 當數據表act_ge_bytearray中已有主鍵但`NAME_` != 'source-extra'時,修改待插入數據的`ID_`爲value(`ID_`)+3000*/

INSERT INTO `act_re_model` VALUES
('180001', '5', '項目變更流程模型', '180001', null, '2019-05-17 12:16:30.980', '2019-05-27 16:43:06.448', '1','{\"name\":\"項目變更流程模型\",\"revision\":1,\"description\":\"項目變更流程:\\n申請人發起變更,科技項目經理進行確認,確認不通過則退回至發起人,通過後流向pmo初審;\\npmo審批:駁回則退回到項目經理確認節點,通過則再判斷條件:非重大項目 and 非重大變更 and 變更類型 等於 計劃變更都成立時,歸檔並結束流程;條件不成立則啓動oa系統中的流程,掛起當前流程,待oa系統的流程通過後回到當前流程,激活流程,判斷是否爲需求變更,不是的話直接歸檔當前流程;是需求變更的話,進行需求分析,分析駁回後退回到pmo初審,分析通過後進行需求分析確認節點,確認通過後流程歸檔。\"}', null, 
        (SELECT (case when (EXISTS (SELECT `ID_` FROM `act_ge_bytearray`  WHERE `ID_`='180002' AND `NAME_` != 'source'))
                    then '183002'
                    else '180002' 
                end) 
        FROM `act_ge_bytearray` limit 1),
        (SELECT (case when (EXISTS (SELECT `ID_` FROM `act_ge_bytearray`  WHERE `ID_`='180003' AND `NAME_` != 'source-extra'))
                    then '183003'
                    else '180003' 
                end) 
        FROM `act_ge_bytearray` limit 1),
        '')
ON DUPLICATE KEY UPDATE `REV_`=VALUES(`REV_`),`NAME_`=VALUES(`NAME_`),`KEY_`=VALUES(`KEY_`),`CATEGORY_`=VALUES(`CATEGORY_`),`CREATE_TIME_`=VALUES(`CREATE_TIME_`),`LAST_UPDATE_TIME_`=VALUES(`LAST_UPDATE_TIME_`),`VERSION_`=VALUES(`VERSION_`),`META_INFO_`=VALUES(`META_INFO_`),`DEPLOYMENT_ID_`=VALUES(`DEPLOYMENT_ID_`),`EDITOR_SOURCE_VALUE_ID_`=VALUES(`EDITOR_SOURCE_VALUE_ID_`),`EDITOR_SOURCE_EXTRA_VALUE_ID_`=VALUES(`EDITOR_SOURCE_EXTRA_VALUE_ID_`),`TENANT_ID_`=VALUES(`TENANT_ID_`);

2、刪除act_ge_bytearray已有數據

DELETE FROM `act_ge_bytearray` WHERE `ID_`='180002' AND `NAME_` = 'source';
DELETE FROM `act_ge_bytearray` WHERE `ID_`='180003' AND `NAME_` = 'source-extra';

3、插入新數據,ID_act_re_model表的EDITOR_SOURCE_VALUE_ID_值和EDITOR_SOURCE_EXTRA_VALUE_ID_

image.png

去除外鍵的sql爲:

ALTER TABLE `act_re_model`
DROP foreign key `ACT_FK_MODEL_SOURCE`;
ALTER TABLE `act_re_model`
DROP foreign key `ACT_FK_MODEL_SOURCE_EXTRA`;
ALTER TABLE `act_re_model`
DROP index `ACT_FK_MODEL_SOURCE`;
ALTER TABLE `act_re_model`
DROP index `ACT_FK_MODEL_SOURCE_EXTRA`;


轉載鏈接:https://www.jianshu.com/p/2df67a811aea
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章