pentaho/pentaho-kettle · error · KettleException
Unable to load job entry of type 'job' from the repository…
Error message
Unable to load job entry of type 'job' from the repository with id_jobentry=
What it means
JobEntryJob.loadRep() wraps any KettleDatabaseException raised while reading the 'job' job entry's attributes (job name, directory, filename, parameters, pass_all_parameters, etc.) from the repository database table into a KettleException with this message plus the offending id_jobentry. It means the repository row for this job-entry is unreadable or inconsistent at the database level.
Solutions
- Check the chained KettleDatabaseException (getCause()) for the real DB error and verify repository connectivity/credentials
- Verify the repository tables exist and match your PDI version (run the repository repair/upgrade tool)
- Inspect rows in R_JOBENTRY_ATTRIBUTE for that id_jobentry and repair or delete/re-save the job entry
- Re-save the job from Spoon so loadRep/loadXML can fall back to a consistent metadata set
Example fix
// before: blindly trusting a stale id
jobEntry.loadRep(rep, metaStore, staleId, databases, slaveServers);
// after: verify the entry exists and handle the failure
try {
if (rep.getJobEntry(id, staleId) != null) {
jobEntry.loadRep(rep, metaStore, staleId, databases, slaveServers);
}
} catch (KettleException e) {
logError("Repository load failed for id_jobentry=" + staleId + ": " + e.getCause(), e);
} Defensive patterns
Strategy: try-catch
Validate before calling
// before loadRep
if (rep == null) throw new IllegalStateException("Repository not connected");
// optionally verify rows exist:
ObjectId id = new StringObjectId(String.valueOf(idJobentry));
// id must reference existing R_JOBENTRY rows Try / catch
try {
entry.loadRep(rep, metaStore, idJobentry, databases, slaveServers);
} catch (KettleException e) {
Throwable cause = e.getCause();
if (cause instanceof KettleDatabaseException) {
// check DB connectivity / repository schema before retrying
}
throw e;
} Prevention
- Keep the repository schema aligned with the PDI version (run the upgrade tool after upgrades)
- Monitor repository DB health (connectivity, locks, disk space)
- Avoid hand-editing repository tables
- Always log the chained cause, not just the wrapper message
When it happens
Trigger: Calling loadRep(rep, metaStore, id_jobentry, ...) when the r_jobentry_attribute rows referenced by id_jobentry are missing, the repository connection is broken, a column has an unexpected type, or a getJobEntryAttribute* call throws KettleDatabaseException (e.g. corrupt parameter rows, DB locked, schema drift between Pentaho versions).
Common situations: Repository schema upgraded/downgraded between Kettle/PDI versions; the job entry row was deleted or partially inserted by a failed saveRep; repository database temporarily unavailable; corrupt id_jobentry passed from metadata.
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
- GetSequenceMeta.Exception.UnableToReadStepInfo
- GetSequenceMeta.Exception.UnableToSaveStepInfo
- JobCopyFiles.Error.Exception.UnableLoadRep
- JobEntryCopyMoveResultFilenames.CanNotLoadFromRep
- JobMoveFiles.Error.Exception.UnableLoadRep
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/6d2a2009116fa627.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/job/JobEntryJob.java:551
for ( int a = 0; a < argnr; a++ ) {
arguments[a] = rep.getJobEntryAttributeString( id_jobentry, a, "argument" );
}
// How many arguments?
int parameternr = rep.countNrJobEntryAttributes( id_jobentry, "parameter_name" );
allocateParams( parameternr );
// Read all parameters ...
for ( int a = 0; a < parameternr; a++ ) {
parameters[a] = rep.getJobEntryAttributeString( id_jobentry, a, "parameter_name" );
parameterFieldNames[a] = rep.getJobEntryAttributeString( id_jobentry, a, "parameter_stream_name" );
parameterValues[a] = rep.getJobEntryAttributeString( id_jobentry, a, "parameter_value" );
}
passingAllParameters = rep.getJobEntryAttributeBoolean( id_jobentry, "pass_all_parameters", true );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( "Unable to load job entry of type 'job' from the repository with id_jobentry="
+ id_jobentry, dbe );
}
}
// Save the attributes of this job entry
//
@Override
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
try {
rep.saveJobEntryAttribute( id_job, getObjectId(), "specification_method", specificationMethod == null
? null : specificationMethod.getCode() );
rep.saveJobEntryAttribute( id_job, getObjectId(), "job_object_id", jobObjectId == null ? null : jobObjectId
.toString() );
rep.saveJobEntryAttribute( id_job, getObjectId(), "name", getJobName() );
rep.saveJobEntryAttribute( id_job, getObjectId(), "dir_path", getDirectory() != null ? getDirectory() : "" );
rep.saveJobEntryAttribute( id_job, getObjectId(), "file_name", filename );
rep.saveJobEntryAttribute( id_job, getObjectId(), "arg_from_previous", argFromPrevious );
rep.saveJobEntryAttribute( id_job, getObjectId(), "params_from_previous", paramsFromPrevious );View on GitHub (pinned to f3058517a1)