{"record":{"id":"74c1366d4acd5b67","repo":"pentaho/pentaho-kettle","slug":"we-can-t-save-the-element-with-type-repositoryelementtype-in","errorCode":null,"errorMessage":"We can't save the element with type [{repositoryElementType}] in the repository","messagePattern":"We can't save the element with type \\[(.+?)\\] in the repository","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/repository/kdr/KettleDatabaseRepository.java","lineNumber":489,"sourceCode":"          securityProvider.validateAction( RepositoryOperation.MODIFY_DATABASE );\n          databaseDelegate.saveDatabaseMeta( (DatabaseMeta) repositoryElement );\n          break;\n        case SLAVE_SERVER:\n          securityProvider.validateAction( RepositoryOperation.MODIFY_SLAVE_SERVER );\n          slaveServerDelegate.saveSlaveServer( (SlaveServer) repositoryElement, parentId, used, overwrite );\n          break;\n        case CLUSTER_SCHEMA:\n          securityProvider.validateAction( RepositoryOperation.MODIFY_CLUSTER_SCHEMA );\n          clusterSchemaDelegate.saveClusterSchema(\n            (ClusterSchema) repositoryElement, versionComment, parentId, used, overwrite );\n          break;\n        case PARTITION_SCHEMA:\n          securityProvider.validateAction( RepositoryOperation.MODIFY_PARTITION_SCHEMA );\n          partitionSchemaDelegate.savePartitionSchema(\n            (PartitionSchema) repositoryElement, parentId, used, overwrite );\n          break;\n        default:\n          throw new KettleException( \"We can't save the element with type [\"\n            + repositoryElement.getRepositoryElementType() + \"] in the repository\" );\n      }\n\n      // Automatically commit changes to these elements.\n      //\n      commit();\n    } finally {\n      unlockRepository();\n    }\n  }\n\n  @Override\n  public void save( RepositoryElementInterface repositoryElement, String versionComment, Calendar versionDate,\n    ProgressMonitorListener monitor, boolean overwrite ) throws KettleException {\n    save( repositoryElement, versionComment, monitor, null, false, overwrite );\n  }\n\n  // Condition","sourceCodeStart":471,"sourceCodeEnd":507,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/repository/kdr/KettleDatabaseRepository.java#L471-L507","documentation":"KettleDatabaseRepository.save has a switch over the element's RepositoryElementType; any element type without a case (i.e. not a transformation, job, or supported shared object) falls into the default and throws this KettleException. The database repository can only persist element types it has save delegates for.","triggerScenarios":"Calling repo.save(repositoryElement, ...) with an element whose getRepositoryElementType() is not handled, e.g. a custom IRepositoryElement implementation or an unsupported object kind.","commonSituations":"Custom plugins embedding their own repository elements into the database repository; generic save utilities iterating heterogeneous element lists; API misuse after refactoring.","solutions":["Only pass supported elements (TransMeta, JobMeta, DatabaseMeta, SlaveServer, ClusterSchema, PartitionSchema, etc.) to save().","Persist custom elements via the appropriate specific save method (e.g. saveDatabaseElement) instead of generic save().","Add a case to the switch / extend the repository for custom element types if you own the fork.","Check the element's getRepositoryElementType() before saving and handle unsupported types explicitly."],"exampleFix":"// before\nrepo.save(customElement, \"comment\", null, true); // unsupported type\n// after\nif (customElement.getRepositoryElementType() == RepositoryObjectType.TRANSFORMATION) {\n  repo.save(customElement, \"comment\", null, true);\n} else {\n  throw new IllegalArgumentException(\"Unsupported element type for repo.save\");\n}","handlingStrategy":"type-guard","validationCode":"Set<RepositoryObjectType> savable = Set.of(RepositoryObjectType.TRANSFORMATION,\n    RepositoryObjectType.JOB, RepositoryObjectType.DATABASE /* + shared objects */);\nif (!savable.contains(element.getRepositoryElementType())) {\n  throw new IllegalArgumentException(\"Element type not supported by repo.save\");\n}","typeGuard":"boolean savable(IRepositoryElement el) {\n  RepositoryElementType t = el.getRepositoryElementType();\n  return t == RepositoryElementType.TRANSFORMATION || t == RepositoryElementType.JOB\n    || t == RepositoryElementType.DATABASE || t == RepositoryElementType.PARTITION_SCHEMA\n    || t == RepositoryElementType.CLUSTER_SCHEMA || t == RepositoryElementType.SLAVE_SERVER;\n}","tryCatchPattern":"try {\n  repo.save(element, comment, null, overwrite);\n} catch (KettleException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"can't save the element with type\")) {\n    // fall back to type-specific persistence or reject\n  } else { throw e; }\n}","preventionTips":["Only pass standard Kettle metadata objects (TransMeta, JobMeta, DatabaseMeta, shared objects) to save().","Inspect getRepositoryElementType() before generic saves.","Use dedicated save methods for special element types."],"tags":["repository","unsupported-type","save"],"backgroundTag":"unsupported-operation","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}