pentaho/pentaho-kettle · error · KettleException

Unable to load job entry of type 'SFTPPUT' to the…

Error message

Unable to load job entry of type 'SFTPPUT' to the repository for id_job=

What it means

In JobEntrySFTPPUT.saveRep, when any of the saveJobEntryAttribute calls fails at the database level, the KettleDatabaseException is wrapped in a KettleException with this message (the message text says 'load' but the code is actually saving — a copy-paste mislabel in this legacy entry). The repository write for the SFTP PUT job entry attributes could not be persisted.

Solutions

  1. Check the repository database connection and retry the save
  2. Verify the DB user has write privileges on the kettle attribute tables
  3. Inspect the wrapped KettleDatabaseException cause for the exact SQL failure
  4. Repair/upgrade the repository schema (r_job_entry_attribute) if it is missing columns

Example fix

// before
rep.saveJobEntryAttribute( id_job, getObjectId(), "destinationfolder", destinationfolder );
// after — ensure a live repository first
if ( rep == null || getObjectId() == null ) {
  throw new KettleException( "No repository connection or object id; cannot save SFTPPUT entry" );
}
rep.saveJobEntryAttribute( id_job, getObjectId(), "destinationfolder", destinationfolder );
Defensive patterns

Strategy: try-catch

Validate before calling

// Java
if ( rep == null ) throw new KettleException( "Repository is null; connect before saving" );
if ( getObjectId() == null ) throw new KettleException( "Job entry not persisted yet; id is null" );

Try / catch

try {
  jobEntry.saveRep( rep, metaStore, id_job );
} catch ( KettleException e ) {
  logError( "Repository save failed: " + e.getCause(), e );
  throw e;
}

Prevention

When it happens

Trigger: Calling saveRep on a JobEntrySFTPPUT while the repository connection is broken, the r_job_entry_attribute table is missing/corrupt, a constraint is violated, or the id_job/objectId is invalid.

Common situations: Saving a job whose repository connection dropped mid-save; DB user lacking INSERT/UPDATE rights on kettle attribute tables; migrating metadata between repositories with schema drift.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/f6eb1477cf96dc67. Report an issue: GitHub.

Appendix: source

Thrown at plugins/put-file-sftp/impl/src/main/java/org/pentaho/di/job/entries/sftpput/JobEntrySFTPPUT.java:351

      rep.saveJobEntryAttribute( id_job, getObjectId(), "keyfilename", keyfilename );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "keyfilepass", Encr
        .encryptPasswordIfNotUsingVariables( keyfilepass ) );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "compression", compression );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "proxyType", proxyType );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "proxyHost", proxyHost );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "proxyPort", proxyPort );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "proxyUsername", proxyUsername );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "proxyPassword", Encr
        .encryptPasswordIfNotUsingVariables( proxyPassword ) );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "aftersftpput", getAfterSFTPPutCode( getAfterFTPS() ) );

      rep.saveJobEntryAttribute( id_job, getObjectId(), "createRemoteFolder", createRemoteFolder );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "destinationfolder", destinationfolder );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "createdestinationfolder", createDestinationFolder );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "successWhenNoFile", successWhenNoFile );

    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( "Unable to load job entry of type 'SFTPPUT' to the repository for id_job="
        + id_job, dbe );
    }
  }

  /**
   * @param createDestinationFolder
   *          The create destination folder flag to set.
   */
  public void setCreateDestinationFolder( boolean createDestinationFolder ) {
    this.createDestinationFolder = createDestinationFolder;
  }

  /**
   * @return Returns the create destination folder flag
   */
  public boolean isCreateDestinationFolder() {
    return createDestinationFolder;
  }

View on GitHub (pinned to f3058517a1)