{"record":{"id":"fef80db394bf3cc9","repo":"flowable/flowable-engine","slug":"there-are-results-size-case-definitions-with-ke-fef80d","errorCode":null,"errorMessage":"There are ${results.size} case definitions with key = '${caseDefinitionKey}' and version = '${caseDefinitionVersion}' in tenant = '${tenantId}'.","messagePattern":"There are (.+?) case definitions with key = '(.+?)' and version = '(.+?)' in tenant = '(.+?)'\\.","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisCaseDefinitionDataManager.java","lineNumber":124,"sourceCode":"            return results.get(0);\n        } else if (results.size() > 1) {\n            throw new FlowableException(\"There are \" + results.size() + \" case definitions with key = '\" + caseDefinitionKey + \"' and version = '\" + caseDefinitionVersion + \"'.\");\n        }\n        return null;\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public CaseDefinitionEntity findCaseDefinitionByKeyAndVersionAndTenantId(String caseDefinitionKey, Integer caseDefinitionVersion, String tenantId) {\n        Map<String, Object> params = new HashMap<>();\n        params.put(\"caseDefinitionKey\", caseDefinitionKey);\n        params.put(\"caseDefinitionVersion\", caseDefinitionVersion);\n        params.put(\"tenantId\", tenantId);\n        List<CaseDefinitionEntity> results = getDbSqlSession().selectList(\"selectCaseDefinitionsByKeyAndVersionAndTenantId\", params);\n        if (results.size() == 1) {\n            return results.get(0);\n        } else if (results.size() > 1) {\n            throw new FlowableException(\n                    \"There are \" + results.size() + \" case definitions with key = '\" + caseDefinitionKey + \"' and version = '\" + caseDefinitionVersion\n                            + \"' in tenant = '\" + tenantId + \"'.\");\n        }\n        return null;\n    }\n\n    @Override\n    public void updateCaseDefinitionTenantIdForDeployment(String deploymentId, String newTenantId) {\n        HashMap<String, Object> params = new HashMap<>();\n        params.put(\"deploymentId\", deploymentId);\n        params.put(\"tenantId\", newTenantId);\n        getDbSqlSession().directUpdate(\"updateCaseDefinitionTenantIdForDeploymentId\", params);\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public List<CaseDefinition> findCaseDefinitionsByQueryCriteria(CaseDefinitionQueryImpl caseDefinitionQuery) {\n        setSafeInValueLists(caseDefinitionQuery);","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/persistence/entity/data/impl/MybatisCaseDefinitionDataManager.java#L106-L142","documentation":"Thrown by MybatisCaseDefinitionDataManager.findCaseDefinitionByKeyAndVersionAndTenantId when more than one case definition matches the given key, version and tenantId. The lookup must resolve to exactly one row, so duplicates within a tenant are treated as an integrity error.","triggerScenarios":"Calling findCaseDefinitionByKeyAndVersionAndTenantId(key, version, tenantId) when the tenant's rows for that key/version are duplicated in the database.","commonSituations":"Duplicated rows after a database restore, migration script running twice, or accidental redeployment with forced same-version insertion; also seen when tenantId filtering was misconfigured in upstream code.","solutions":["Inspect the database for duplicates: SELECT * FROM ACT_CMMN_CASEDEF WHERE KEY_ = ? AND VERSION_ = ? AND TENANT_ID_ = ?","Remove or merge duplicate rows so the combination is unique","Redeploy the case definition correctly so a new version (not a duplicate version) is created"],"exampleFix":"// before\n// DB contains two rows for (key='orderFlow', version=3, tenant='tenantA')\nCaseDefinition cd = em.findCaseDefinitionByKeyAndVersionAndTenantId(\"orderFlow\", 3, \"tenantA\"); // throws\n// after\nDELETE FROM ACT_CMMN_CASEDEF WHERE ID_ = 'duplicateRowId';\nCaseDefinition cd = em.findCaseDefinitionByKeyAndVersionAndTenantId(\"orderFlow\", 3, \"tenantA\");","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    return dataManager.findCaseDefinitionByKeyAndVersionAndTenantId(key, version, tenantId);\n} catch (FlowableException e) {\n    // inspect duplicates for this tenant, clean up and retry\n}","preventionTips":["Make deployments idempotent so re-deployments create new versions, not duplicate rows","Audit the definitions table after database restores or migrations","Include tenantId in all definition lookups when multi-tenant"],"tags":["cmmn","duplicate-records","multi-tenant"],"backgroundTag":"empty-result-set","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}