pentaho/pentaho-kettle · error · KettleException
Unable to find Job Entry Type with id=jobEntryTypeId in the…
Error message
Unable to find Job Entry Type with id=jobEntryTypeId in the repository
What it means
The Pentaho Kettle database repository loader could not resolve a job entry's type id (id_jobentry_type) to a known job entry type code in table R_JOBENTRY_TYPE. This means the row referencing the job entry type is missing or stale, so the job entry cannot be reconstructed and loading aborts with a KettleException.
Solutions
- Check that R_JOBENTRY_TYPE contains a row whose ID_JOBENTRY_TYPE matches the id_jobentry_type referenced by the R_JOBENTRY_COPY row for this job entry copy
- Reinsert or repair the missing job entry type row (correct CODE value for the plugin, e.g. 'SPECIAL')
- Re-export the job XML and re-import it into a healthy repository to recreate the entry copy with a valid type
- Check repository version compatibility (repository upgrade via Repository.connect/upgrade) so type tables match the installed plugins
Example fix
// before: loading a job copy whose type row was pruned
JobEntryCopy copy = repository.jobEntryDelegate.loadJobEntryCopy(jobId, jobEntryCopyId, jobMeta);
// after: verify the type row first / repair it
LongObjectId typeId = repository.connectionDelegate.getIDWithValue(
repository.connectionDelegate.quoteTable(KettleDatabaseRepository.TABLE_R_JOBENTRY_TYPE), "ID_JOBENTRY_TYPE", "CODE", "SPECIAL");
if (typeId == null) throw new IllegalStateException("Run repository repair: R_JOBENTRY_TYPE is missing required codes"); Defensive patterns
Strategy: try-catch
Validate before calling
LongObjectId typeId = (LongObjectId) repository.connectionDelegate.getIDWithValue(
repository.connectionDelegate.quoteTable(KettleDatabaseRepository.TABLE_R_JOBENTRY_TYPE),
"ID_JOBENTRY_TYPE", "CODE", expectedCode);
if (typeId == null) throw new IllegalStateException("Missing R_JOBENTRY_TYPE row"); Type guard
boolean typeRowExists(ObjectId typeId) { return repository.connectionDelegate.countNrSomething("ID_JOBENTRY_TYPE", KettleDatabaseRepository.TABLE_R_JOBENTRY_TYPE, "ID_JOBENTRY_TYPE", typeId) > 0; } Try / catch
try { return repository.jobEntryDelegate.loadJobEntryCopy(jobId, copyId, jobMeta); }
catch (KettleException e) { throw new KettleException("Job entry type row missing in repository; repair R_JOBENTRY_TYPE", e); } Prevention
- Never delete rows from R_JOBENTRY_TYPE manually
- Keep repository schema and plugin set in sync across PDI upgrades
- Back up the repository before cleanup scripts
When it happens
Trigger: Calling KettleDatabaseRepositoryJobEntryDelegate.loadJobEntryCopy where getJobEntryType(id_jobentry_type) returns null — i.e. the id_jobentry_type column in R_JOBENTRY_COPY points at a row that does not exist or was deleted from R_JOBENTRY_TYPE.
Common situations: Restoring a job from a partial repository backup; a repository upgraded/migrated between Pentaho versions where job entry types were renamed; manually editing or pruning repository tables; a corrupted repository database.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
- JobEntryCheckFilesLocked.UnableToLoadFromRepo
- JobEntryCheckFilesLocked.UnableToSaveToRepo
- JobEntryColumnsExist.Meta.UnableLoadRep
- JobEntryColumnsExist.Meta.UnableSaveRep
- JobEntryEval.UnableToLoadFromRepo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/fc7f57d1e04a6b9c.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryJobEntryDelegate.java:169
// Otherwise you're on your own.
//
if ( jobEntry instanceof JobEntryBase ) {
loadJobEntryBase( (JobEntryBase) jobEntry, jobEntryId, databases, slaveServers );
( (JobEntryBase) jobEntry ).setAttributesMap( loadJobEntryAttributesMap( jobId, jobEntryId ) );
}
compatibleJobEntryLoadRep( jobEntry, repository, jobEntryTypeId, databases, slaveServers );
jobEntry.loadRep( repository, repository.metaStore, jobEntryId, databases, slaveServers );
jobEntryCopy.getEntry().setObjectId( jobEntryId );
jobentries.add( jobEntryCopy.getEntry() );
} else {
throw new KettleException( "JobEntryLoader was unable to find Job Entry Plugin with description ["
+ jet_code + "]." );
}
} else {
throw new KettleException( "Unable to find Job Entry Type with id="
+ jobEntryTypeId + " in the repository" );
}
}
jobEntryCopy.setLocation( locx, locy );
jobEntryCopy.setDrawn( isdrawn );
jobEntryCopy.setLaunchingInParallel( isparallel );
return jobEntryCopy;
} else {
throw new KettleException( "Unable to find job entry copy in repository with id_jobentry_copy="
+ jobEntryCopyId );
}
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( "Unable to load job entry copy from repository with id_jobentry_copy="
+ jobEntryCopyId, dbe );
}
}View on GitHub (pinned to f3058517a1)