pentaho/pentaho-kettle · error · KettleException
Unable to load job entry of type 'special' from the…
Error message
Unable to load job entry of type 'special' from the repository for id_jobentry=
What it means
KettleException thrown by JobEntrySpecial.loadRep when reading the 'special' job entry's schedule attributes (intervalMinutes, hour, minutes, weekDay, dayOfMonth) from the repository fails with a KettleDatabaseException. It wraps the low-level database error and identifies the job entry by id_jobentry so the corrupt/unreadable record can be located.
Solutions
- Verify the repository database is reachable and credentials are valid (test the repository connection).
- Check R_JOBENTRY_ATTRIBUTE rows exist for the given id_jobentry with the attributes intervalMinutes/hour/minutes/weekDay/dayOfMonth.
- Reopen and re-save the job entry in Spoon to regenerate the attribute rows.
- Inspect the wrapped KettleDatabaseException cause for the actual SQL/database error.
Example fix
// before
JobEntrySpecial special = (JobEntrySpecial) jobMeta.findJobEntry("Start").getEntry();
special.loadRep(rep, metaStore, idJobentry, databases, slaveServers);
// after
if (rep != null && idJobentry != null) {
try {
special.loadRep(rep, metaStore, idJobentry, databases, slaveServers);
} catch (KettleException e) {
logError("Failed loading special entry " + idJobentry + ": " + e.getCause(), e);
}
} Defensive patterns
Strategy: try-catch
Validate before calling
if (rep == null || idJobentry == null) throw new IllegalArgumentException("Repository and idJobentry are required");
// optionally verify connectivity: rep.connect(...) beforehand
Try / catch
try {
special.loadRep(rep, metaStore, idJobentry, databases, slaveServers);
} catch (KettleException e) {
logError("Load failed for id_jobentry=" + idJobentry + " cause=" + e.getCause(), e);
} Prevention
- Keep the repository database reachable and credentials valid
- Never delete R_JOBENTRY_ATTRIBUTE rows manually
- Keep repository schema in sync with the Pentaho version
- Log the wrapped cause for diagnosis
When it happens
Trigger: Calling loadRep for a 'special' job entry (Start job entry) against a repository where the KettleDatabaseException can be raised by getJobEntryAttributeInteger: repository connection down, missing R_JOBENTRY_ATTRIBUTE rows, schema mismatch, or corrupt attribute values.
Common situations: Repository database unavailable or network dropped mid-load; loading a job exported from a different Pentaho version where attribute columns changed; the special entry's attributes were deleted manually from R_JOBENTRY_ATTRIBUTE.
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
- Unable to load job entry for type file exists from the…
- Unable to load job entry from the repository for…
- Unable to load job entry from the repository for…
- Unable to load job entry of type 'Msgbox Info' from the…
- Unable to load job entry of type 'sql' from the repository…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/7485b75c13b058f8.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/special/JobEntrySpecial.java:132
throw new KettleXMLException( "Unable to load job entry of type 'special' from XML node", e );
}
}
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
start = rep.getJobEntryAttributeBoolean( id_jobentry, "start" );
dummy = rep.getJobEntryAttributeBoolean( id_jobentry, "dummy" );
repeat = rep.getJobEntryAttributeBoolean( id_jobentry, "repeat" );
schedulerType = (int) rep.getJobEntryAttributeInteger( id_jobentry, "schedulerType" );
intervalSeconds = (int) rep.getJobEntryAttributeInteger( id_jobentry, "intervalSeconds" );
intervalMinutes = (int) rep.getJobEntryAttributeInteger( id_jobentry, "intervalMinutes" );
hour = (int) rep.getJobEntryAttributeInteger( id_jobentry, "hour" );
minutes = (int) rep.getJobEntryAttributeInteger( id_jobentry, "minutes" );
weekDay = (int) rep.getJobEntryAttributeInteger( id_jobentry, "weekDay" );
dayOfMonth = (int) rep.getJobEntryAttributeInteger( id_jobentry, "dayOfMonth" );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( "Unable to load job entry of type 'special' from the repository for id_jobentry="
+ id_jobentry, dbe );
}
}
// Save the attributes of this job entry
//
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
try {
rep.saveJobEntryAttribute( id_job, getObjectId(), "start", start );
rep.saveJobEntryAttribute( id_job, getObjectId(), "dummy", dummy );
rep.saveJobEntryAttribute( id_job, getObjectId(), "repeat", repeat );
rep.saveJobEntryAttribute( id_job, getObjectId(), "schedulerType", schedulerType );
rep.saveJobEntryAttribute( id_job, getObjectId(), "intervalSeconds", intervalSeconds );
rep.saveJobEntryAttribute( id_job, getObjectId(), "intervalMinutes", intervalMinutes );
rep.saveJobEntryAttribute( id_job, getObjectId(), "hour", hour );
rep.saveJobEntryAttribute( id_job, getObjectId(), "minutes", minutes );
rep.saveJobEntryAttribute( id_job, getObjectId(), "weekDay", weekDay );
rep.saveJobEntryAttribute( id_job, getObjectId(), "dayOfMonth", dayOfMonth );View on GitHub (pinned to f3058517a1)