flowable/flowable-engine · error · FlowableException
There are event definitions with key = ' ' and version = '…
Error message
There are ${results.size()} event definitions with key = '${eventDefinitionKey}' and version = '${eventVersion}'. What it means
Thrown by MybatisEventDefinitionDataManager.findEventDefinitionByKeyAndVersion when selectEventDefinitionsByKeyAndVersion returns more than one EventDefinitionEntity for the same key and version. Event definition key+version is expected to be unique, so multiple rows signal duplicate persisted data. Deployment lookups relying on this method then fail with this FlowableException.
Solutions
- Inspect and clean duplicates: SELECT * FROM FLW_EV_DATABASE_DEFINITION WHERE KEY_=? AND VERSION_=? and remove all but one row.
- Serialize event model deployment across nodes (lock or leader-elected deployment on startup).
- Add a unique database constraint on (KEY_, VERSION_) to prevent recurrence.
- Keep the row whose DEPLOYMENT_ID_ still exists and delete orphans.
Example fix
-- before (duplicate rows break lookups) SELECT ID_, DEPLOYMENT_ID_ FROM FLW_EV_DATABASE_DEFINITION WHERE KEY_='orderEvent' AND VERSION_=1; -- after: keep exactly one DELETE FROM FLW_EV_DATABASE_DEFINITION WHERE KEY_='orderEvent' AND VERSION_=1 AND ID_ != '<kept-id>';
Defensive patterns
Strategy: validation
Validate before calling
long n = eventRepositoryService.createEventDefinitionQuery()
.eventDefinitionKey(key).eventDefinitionVersion(version).count();
if (n > 1) throw new IllegalStateException("duplicate event definitions for key " + key + " v" + version + ", clean DB before lookup"); Try / catch
try {
def = manager.findEventDefinitionByKeyAndVersion(key, version);
} catch (FlowableException e) {
def = dedupeAndRetry(key, version); // delete extra rows, then retry
} Prevention
- Add unique constraint on FLW_EV_DATABASE_DEFINITION (KEY_, VERSION_).
- Deploy event models from a single node or under a distributed lock.
- Make migration scripts idempotent so they cannot run twice.
- Schedule periodic consistency checks for key/version uniqueness.
When it happens
Trigger: Two or more FLW_EV_DATABASE_DEFINITION rows with identical KEY_ and VERSION_ — usually caused by concurrent deployments of the same event model on separate cluster nodes.
Common situations: Cluster nodes bootstrapping the same event definitions at the same time; missing unique index on (KEY_, VERSION_); migration scripts executed twice; retries re-inserting definitions after timeouts.
Understand the failure class
Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.
Related errors
- There are event definitions with key = ' ' and version = '…
- There are event definitions with key = ' ' and version = '…
- Could not resolve key for
- couldn't deduct database type from database product name
- couldn't get db schema version
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/e8f94d6089352cce.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/persistence/entity/data/impl/MybatisEventDefinitionDataManager.java:120
public EventDefinitionEntity findEventDefinitionByDeploymentAndKeyAndTenantId(String deploymentId, String eventDefinitionKey, String tenantId) {
Map<String, Object> parameters = new HashMap<>();
parameters.put("deploymentId", deploymentId);
parameters.put("eventDefinitionKey", eventDefinitionKey);
parameters.put("tenantId", tenantId);
return (EventDefinitionEntity) getDbSqlSession().selectOne("selectEventDefinitionByDeploymentAndKeyAndTenantId", parameters);
}
@Override
@SuppressWarnings("unchecked")
public EventDefinitionEntity findEventDefinitionByKeyAndVersion(String eventDefinitionKey, Integer eventVersion) {
Map<String, Object> params = new HashMap<>();
params.put("eventDefinitionKey", eventDefinitionKey);
params.put("eventVersion", eventVersion);
List<EventDefinitionEntity> results = getDbSqlSession().selectList("selectEventDefinitionsByKeyAndVersion", params);
if (results.size() == 1) {
return results.get(0);
} else if (results.size() > 1) {
throw new FlowableException("There are " + results.size() + " event definitions with key = '" + eventDefinitionKey + "' and version = '" + eventVersion + "'.");
}
return null;
}
@Override
@SuppressWarnings("unchecked")
public EventDefinitionEntity findEventDefinitionByKeyAndVersionAndTenantId(String eventDefinitionKey, Integer eventVersion, String tenantId) {
Map<String, Object> params = new HashMap<>();
params.put("eventDefinitionKey", eventDefinitionKey);
params.put("eventVersion", eventVersion);
params.put("tenantId", tenantId);
List<EventDefinitionEntity> results = getDbSqlSession().selectList("selectEventDefinitionsByKeyAndVersionAndTenantId", params);
if (results.size() == 1) {
return results.get(0);
} else if (results.size() > 1) {
throw new FlowableException("There are " + results.size() + " event definitions with key = '" + eventDefinitionKey + "' and version = '" + eventVersion + "' in tenant = '" + tenantId + "'.");
}
return null;View on GitHub (pinned to d6d39ce1c6)