{"record":{"id":"6b3690241ff159f6","repo":"flowable/flowable-engine","slug":"there-are-results-size-case-definitions-with-ke","errorCode":null,"errorMessage":"There are ${results.size} case definitions with key = '${caseDefinitionKey}' and version = '${caseDefinitionVersion}'.","messagePattern":"There are (.+?) case definitions with key = '(.+?)' and version = '(.+?)'\\.","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":108,"sourceCode":"    @Override\n    public CaseDefinitionEntity findCaseDefinitionByParentDeploymentAndKeyAndTenantId(String parentDeploymentId, String caseDefinitionKey, String tenantId) {\n        Map<String, Object> parameters = new HashMap<>();\n        parameters.put(\"parentDeploymentId\", parentDeploymentId);\n        parameters.put(\"caseDefinitionKey\", caseDefinitionKey);\n        parameters.put(\"tenantId\", tenantId);\n        return (CaseDefinitionEntity) getDbSqlSession().selectOne(\"selectCaseDefinitionByParentDeploymentAndKeyAndTenantId\", parameters);\n    }\n\n    @Override\n    public CaseDefinitionEntity findCaseDefinitionByKeyAndVersion(String caseDefinitionKey, Integer caseDefinitionVersion) {\n        Map<String, Object> params = new HashMap<>();\n        params.put(\"caseDefinitionKey\", caseDefinitionKey);\n        params.put(\"caseDefinitionVersion\", caseDefinitionVersion);\n        List<CaseDefinitionEntity> results = getDbSqlSession().selectList(\"selectCaseDefinitionsByKeyAndVersion\", params);\n        if (results.size() == 1) {\n            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 + \"'.\");","sourceCodeStart":90,"sourceCodeEnd":126,"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#L90-L126","documentation":"Thrown by MybatisCaseDefinitionDataManager.findCaseDefinitionByKeyAndVersion when the database query returns more than one case definition with the same key and version. The engine expects (key, version) to be unique across tenants and throws instead of guessing which row to return.","triggerScenarios":"Calling findCaseDefinitionByKeyAndVersion(key, version) when multiple rows exist for that key/version pair, typically because the same definition was deployed twice into different tenants and no tenant was specified.","commonSituations":"Multi-tenant deployments with duplicate keys; manual database manipulation or migrations that duplicated rows; a data repair gone wrong leaving inconsistent definitions.","solutions":["Use findCaseDefinitionByKeyAndVersionAndTenantId(key, version, tenantId) instead so the tenant narrows the result to one row","Delete or merge the duplicate rows so key+version is unique","Re-run the affected deployments with unique keys or versions"],"exampleFix":"// before\nCaseDefinition cd = caseDefinitionEntityManager.findCaseDefinitionByKeyAndVersion(\"orderFlow\", 3);\n// after\nCaseDefinition cd = caseDefinitionEntityManager.findCaseDefinitionByKeyAndVersionAndTenantId(\"orderFlow\", 3, \"tenantA\");","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    return dataManager.findCaseDefinitionByKeyAndVersion(key, version);\n} catch (FlowableException e) {\n    // fall back to tenant-scoped lookup or log duplicates\n}","preventionTips":["In multi-tenant setups always use the tenant-scoped lookup","Monitor for duplicate keys in ACT_CMMN_CASEDEF","Never insert definition rows manually outside the deployment API"],"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"}