pentaho/pentaho-kettle · error · KettleException

Unable to find job entry copy in repository with…

Error message

Unable to find job entry copy in repository with id_jobentry_copy=jobEntryCopyId

What it means

No row was found in R_JOBENTRY_COPY for the requested id_jobentry_copy, so loadJobEntryCopy cannot return a JobEntryCopy and throws a KettleException. This is a plain record-not-found condition in the database repository.

Solutions

  1. Verify the row exists: SELECT * FROM R_JOBENTRY_COPY WHERE ID_JOBENTRY_COPY = <id>
  2. Reload the JobMeta from the repository so job entry copies are looked up with fresh, valid ids instead of stale cached ones
  3. Re-save the job to the repository to recreate missing copy rows
  4. Confirm you are connected to the same repository database the ids came from

Example fix

// before
JobEntryCopy c = repository.jobEntryDelegate.loadJobEntryCopy(jobId, staleCopyId, jobMeta);
// after: re-resolve the id from a freshly loaded job
JobMeta jobMeta = repository.loadJob(jobName, null);
JobEntryCopy c = jobMeta.findJobEntry(entryName, 0, false);
Defensive patterns

Strategy: validation

Validate before calling

Long copyId = ((LongObjectId) jobEntryCopyId).longValue();
// run: SELECT COUNT(*) FROM R_JOBENTRY_COPY WHERE ID_JOBENTRY_COPY = ?
if (count == 0) throw new IllegalStateException("id_jobentry_copy not in repository");

Type guard

boolean copyExists(ObjectId copyId) { return repository.connectionDelegate.getDatabase().countRecords(repository.databaseMeta.getSchemaAndTable("R_JOBENTRY_COPY"), "ID_JOBENTRY_COPY", copyId) > 0; }

Try / catch

try { ... } catch (KettleException e) { if (e.getMessage().contains("Unable to find job entry copy")) reloadJobMetaFromRepository(); }

Prevention

When it happens

Trigger: Calling loadJobEntryCopy(jobId, jobEntryCopyId, ...) with a jobEntryCopyId whose row was deleted from R_JOBENTRY_COPY, or an id from a different/cleared repository.

Common situations: Caching ObjectIds across repository refreshes; copying jobs between repositories by id; rows removed by repository cleanup scripts; pointing the client at a different database than where the job was saved.

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/3281291ce03f7c90. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryJobEntryDelegate.java:180

              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 );
    }
  }

  @SuppressWarnings( "deprecation" )
  private void compatibleJobEntryLoadRep( JobEntryInterface jobEntry, KettleDatabaseRepository repository,
    ObjectId id_jobentry_type, List<DatabaseMeta> databases, List<SlaveServer> slaveServers ) throws KettleException {

    jobEntry.loadRep( repository, id_jobentry_type, databases, slaveServers );

  }

  public void saveJobEntryCopy( JobEntryCopy copy, ObjectId id_job, KettleDatabaseRepositoryMetaStore metaStore ) throws KettleException {
    try {

View on GitHub (pinned to f3058517a1)