pentaho/pentaho-kettle · error · KettleException
Unable to save repository element [" + element + "]
Error message
Unable to save repository element [" + element + "]
What it means
Generic wrapper thrown by PurRepository.saveRepositoryElement: any Exception raised while saving an element (including the unsupported-class error above or failures inside the individual save methods) is rethrown as a KettleException with the original as cause.
Solutions
- Inspect the cause chain (getCause()) for the real underlying error
- Verify repository connectivity and permissions before saving
- Fix the root cause indicated by the wrapped exception
Defensive patterns
Strategy: try-catch
Try / catch
try {
repository.save(element, comment, calendar, monitor);
} catch (KettleException e) {
Throwable root = e;
while (root.getCause() != null) root = root.getCause();
log.error("Save of " + element + " failed: " + root.getMessage(), e);
} Prevention
- Always inspect getCause() chain for the real error
- Verify repository connectivity before bulk saves
- Check permissions on target folder before saving
When it happens
Trigger: Any failure inside saveRepositoryElement's try block — e.g. saveDatabaseMeta, saveClusterSchema, savePartitionSchema throwing due to repository connectivity, permission issues, or unsupported element type.
Common situations: Repository connectivity drops mid-save; insufficient permissions in the Pentaho repository; saving an element whose dependent objects are missing; server-side validation failures.
Related errors
- AbsSecurityProvider.ERROR_0002_UNABLE_TO_ACCESS_IS_ALLOWED
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- Error loading job details
- File is currently locked by another user for editing
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/11f3076cd00048e4.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java:2203
break;
case DATABASE:
saveDatabaseMeta( element, versionComment, versionDate );
break;
case SLAVE_SERVER:
saveSlaveServer( element, versionComment, versionDate );
break;
case CLUSTER_SCHEMA:
saveClusterSchema( element, versionComment, versionDate );
break;
case PARTITION_SCHEMA:
savePartitionSchema( element, versionComment, versionDate );
break;
default:
throw new KettleException(
"It's not possible to save Class [" + element.getClass().getName() + "] to the repository" );
}
} catch ( Exception e ) {
throw new KettleException( "Unable to save repository element [" + element + "]", e );
}
}
private boolean isRenamed( final RepositoryElementInterface element, final RepositoryFile file )
throws KettleException {
if ( element.getObjectId() == null ) {
return false; // never been saved
}
String filename = element.getName();
switch ( element.getRepositoryElementType() ) {
case TRANSFORMATION:
filename += RepositoryObjectType.TRANSFORMATION.getExtension();
break;
case JOB:
filename += RepositoryObjectType.JOB.getExtension();
break;
case DATABASE:
filename += RepositoryObjectType.DATABASE.getExtension();View on GitHub (pinned to f3058517a1)