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

  1. 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
  2. Reinsert or repair the missing job entry type row (correct CODE value for the plugin, e.g. 'SPECIAL')
  3. Re-export the job XML and re-import it into a healthy repository to recreate the entry copy with a valid type
  4. 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

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


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)