pentaho/pentaho-kettle · error · KettleException
JobExportRepository.Meta.UnableSaveRep
JobExportRepository.Meta.UnableSaveRep
Error message
JobExportRepository.Meta.UnableSaveRep
What it means
JobEntryExportRepository.saveRep wraps KettleDatabaseException from saving the entry's attributes in a KettleException with the localized 'JobExportRepository.Meta.UnableSaveRep' message including the job id. The attribute write to the repository failed.
Solutions
- Read the wrapped KettleDatabaseException for the root SQL cause
- Grant the repository user INSERT/UPDATE rights on r_jobentry_attribute
- Reconnect and retry the save; shorten values if column limits are hit
Defensive patterns
Strategy: try-catch
Try / catch
try { entry.saveRep( rep, metaStore, idJob ); } catch ( KettleException e ) { log.error( "Repo save failed: " + e.getCause(), e ); } Prevention
- Ensure write access to r_jobentry_attribute
- Handle transient DB errors with retry
- Keep attribute values within column limits
When it happens
Trigger: saveRep called when the repository DB throws during saveJobEntryAttribute (connection lost, constraint violation, read-only user, value too long).
Common situations: Read-only repository credentials; network interruption while saving a job; oversized attribute values.
Related errors
- JobEntryAbort.UnableToLoadFromRepo.Label
- JobEntryAbort.UnableToSaveToRepo.Label
- JobEntryAddResultFilenames.UnableToLoadFromRepo
- JobEntryConnectedToRepository.Meta.UnableToLoadFromRep
- JobEntryConnectedToRepository.Meta.UnableToSaveToRep
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/9972d1e5d19e3984.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/export-repository/impl/src/main/java/org/pentaho/di/job/entries/exportrepository/JobEntryExportRepository.java:248
rep.saveJobEntryAttribute( id_job, getObjectId(), "repositoryname", repositoryname );
rep.saveJobEntryAttribute( id_job, getObjectId(), "username", username );
rep.saveJobEntryAttribute( id_job, getObjectId(), "password", Encr
.encryptPasswordIfNotUsingVariables( password ) );
rep.saveJobEntryAttribute( id_job, getObjectId(), "targetfilename", targetfilename );
rep.saveJobEntryAttribute( id_job, getObjectId(), "iffileexists", iffileexists );
rep.saveJobEntryAttribute( id_job, getObjectId(), "export_type", export_type );
rep.saveJobEntryAttribute( id_job, getObjectId(), "directoryPath", directoryPath );
rep.saveJobEntryAttribute( id_job, getObjectId(), "add_date", add_date );
rep.saveJobEntryAttribute( id_job, getObjectId(), "add_time", add_time );
rep.saveJobEntryAttribute( id_job, getObjectId(), "SpecifyFormat", SpecifyFormat );
rep.saveJobEntryAttribute( id_job, getObjectId(), "date_time_format", date_time_format );
rep.saveJobEntryAttribute( id_job, getObjectId(), "createfolder", createfolder );
rep.saveJobEntryAttribute( id_job, getObjectId(), "newfolder", newfolder );
rep.saveJobEntryAttribute( id_job, getObjectId(), "add_result_filesname", add_result_filesname );
rep.saveJobEntryAttribute( id_job, getObjectId(), "nr_errors_less_than", nr_errors_less_than );
rep.saveJobEntryAttribute( id_job, getObjectId(), "success_condition", success_condition );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( BaseMessages.getString( PKG, "JobExportRepository.Meta.UnableSaveRep", ""
+ id_job ), dbe );
}
}
public void setSuccessCondition( String success_condition ) {
this.success_condition = success_condition;
}
public String getSuccessCondition() {
return success_condition;
}
public void setRepositoryname( String repositoryname ) {
this.repositoryname = repositoryname;
}
public String getRepositoryname() {
return repositoryname;View on GitHub (pinned to f3058517a1)