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

  1. Check the chained KettleDatabaseException (getCause()) for the real DB error and verify repository connectivity/credentials
  2. Verify the repository tables exist and match your PDI version (run the repository repair/upgrade tool)
  3. Inspect rows in R_JOBENTRY_ATTRIBUTE for that id_jobentry and repair or delete/re-save the job entry
  4. 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

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


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)