{"record":{"id":"498833081aeba8c4","repo":"flowable/flowable-engine","slug":"there-are-results-size-event-definitions-with-498833","errorCode":null,"errorMessage":"There are ${results.size()} event definitions with key = '${eventDefinitionKey}' and version = '${eventVersion}' in tenant = '${tenantId}'.","messagePattern":"There are (.+?) event definitions with key = '(.+?)' and version = '(.+?)' in tenant = '(.+?)'\\.","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/persistence/entity/data/impl/MybatisEventDefinitionDataManager.java","lineNumber":136,"sourceCode":"            return results.get(0);\n        } else if (results.size() > 1) {\n            throw new FlowableException(\"There are \" + results.size() + \" event definitions with key = '\" + eventDefinitionKey + \"' and version = '\" + eventVersion + \"'.\");\n        }\n        return null;\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public EventDefinitionEntity findEventDefinitionByKeyAndVersionAndTenantId(String eventDefinitionKey, Integer eventVersion, String tenantId) {\n        Map<String, Object> params = new HashMap<>();\n        params.put(\"eventDefinitionKey\", eventDefinitionKey);\n        params.put(\"eventVersion\", eventVersion);\n        params.put(\"tenantId\", tenantId);\n        List<EventDefinitionEntity> results = getDbSqlSession().selectList(\"selectEventDefinitionsByKeyAndVersionAndTenantId\", 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() + \" event definitions with key = '\" + eventDefinitionKey + \"' and version = '\" + eventVersion + \"' in tenant = '\" + tenantId + \"'.\");\n        }\n        return null;\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public List<EventDefinition> findEventDefinitionsByNativeQuery(Map<String, Object> parameterMap) {\n        return getDbSqlSession().selectListWithRawParameter(\"selectEventDefinitionByNativeQuery\", parameterMap);\n    }\n\n    @Override\n    public long findEventDefinitionCountByNativeQuery(Map<String, Object> parameterMap) {\n        return (Long) getDbSqlSession().selectOne(\"selectEventDefinitionCountByNativeQuery\", parameterMap);\n    }\n\n    @Override\n    public void updateEventDefinitionTenantIdForDeployment(String deploymentId, String newTenantId) {\n        HashMap<String, Object> params = new HashMap<>();","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/persistence/entity/data/impl/MybatisEventDefinitionDataManager.java#L118-L154","documentation":"Thrown by MybatisEventDefinitionDataManager.findEventDefinitionByKeyAndVersionAndTenantId when the tenant-scoped key+version query returns more than one row. In a multi-tenant setup, (TENANT_ID_, KEY_, VERSION_) must be unique; duplicates mean the same event definition version was persisted twice for that tenant.","triggerScenarios":"Concurrent per-tenant deployment of the same event model key/version on multiple nodes; both inserts commit and the next lookup throws FlowableException.","commonSituations":"Every application instance running tenant bootstrap deployment code at startup; duplicated migration scripts; manual copies of definition rows across tenants done incorrectly (same tenant twice).","solutions":["Remove duplicate FLW_EV_DATABASE_DEFINITION rows matching the same TENANT_ID_, KEY_, VERSION_, keeping one.","Make tenant bootstrap deployments idempotent: check EventDefinitionQuery for the tenant before deploying.","Add a unique constraint on (TENANT_ID_, KEY_, VERSION_).","Use a distributed lock or single deployer node for event registry deployments."],"exampleFix":"// before\neventRepositoryService.createDeployment().addClasspathResource(res).tenantId(tenantId).deploy(); // all nodes\n// after\nif (eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(key)\n        .eventDefinitionVersion(version).tenantId(tenantId).count() == 0) {\n    eventRepositoryService.createDeployment().addClasspathResource(res).tenantId(tenantId).deploy();\n}","handlingStrategy":"validation","validationCode":"long n = eventRepositoryService.createEventDefinitionQuery()\n    .eventDefinitionKey(key).eventDefinitionVersion(version).tenantId(tenantId).count();\nif (n > 1) throw new IllegalStateException(\"duplicate tenant event definitions for \" + key + \" v\" + version + \" tenant \" + tenantId);","typeGuard":null,"tryCatchPattern":"try {\n    def = manager.findEventDefinitionByKeyAndVersionAndTenantId(key, version, tenantId);\n} catch (FlowableException e) {\n    def = dedupeTenantRowsAndRetry(key, version, tenantId);\n}","preventionTips":["Add unique constraint on (TENANT_ID_, KEY_, VERSION_).","Make per-tenant bootstrap deployment idempotent via existence checks.","Use one deployer node or a lock for multi-tenant event deployments.","Verify manual tenant data copies never duplicate rows within one tenant."],"tags":["flowable","event-definition","multi-tenant","duplicate-data"],"backgroundTag":"database-query-failed","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}