pentaho/pentaho-kettle · error · KettleException

JobExportRepository.Meta.UnableSaveRep

JobExportRepository.Meta.UnableSaveRep

Error message

JobExportRepository.Meta.UnableSaveRep

What it means

JobEntryExportRepository.saveRep wraps KettleDatabaseException from saving the entry's attributes in a KettleException with the localized 'JobExportRepository.Meta.UnableSaveRep' message including the job id. The attribute write to the repository failed.

Solutions

  1. Read the wrapped KettleDatabaseException for the root SQL cause
  2. Grant the repository user INSERT/UPDATE rights on r_jobentry_attribute
  3. Reconnect and retry the save; shorten values if column limits are hit
Defensive patterns

Strategy: try-catch

Try / catch

try { entry.saveRep( rep, metaStore, idJob ); } catch ( KettleException e ) { log.error( "Repo save failed: " + e.getCause(), e ); }

Prevention

When it happens

Trigger: saveRep called when the repository DB throws during saveJobEntryAttribute (connection lost, constraint violation, read-only user, value too long).

Common situations: Read-only repository credentials; network interruption while saving a job; oversized attribute values.

Related errors


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

Appendix: source

Thrown at plugins/export-repository/impl/src/main/java/org/pentaho/di/job/entries/exportrepository/JobEntryExportRepository.java:248

      rep.saveJobEntryAttribute( id_job, getObjectId(), "repositoryname", repositoryname );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "username", username );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "password", Encr
        .encryptPasswordIfNotUsingVariables( password ) );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "targetfilename", targetfilename );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "iffileexists", iffileexists );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "export_type", export_type );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "directoryPath", directoryPath );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "add_date", add_date );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "add_time", add_time );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "SpecifyFormat", SpecifyFormat );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "date_time_format", date_time_format );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "createfolder", createfolder );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "newfolder", newfolder );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "add_result_filesname", add_result_filesname );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "nr_errors_less_than", nr_errors_less_than );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "success_condition", success_condition );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages.getString( PKG, "JobExportRepository.Meta.UnableSaveRep", ""
        + id_job ), dbe );
    }
  }

  public void setSuccessCondition( String success_condition ) {
    this.success_condition = success_condition;
  }

  public String getSuccessCondition() {
    return success_condition;
  }

  public void setRepositoryname( String repositoryname ) {
    this.repositoryname = repositoryname;
  }

  public String getRepositoryname() {
    return repositoryname;

View on GitHub (pinned to f3058517a1)