pentaho/pentaho-kettle · error · KettleException

JobEntryColumnsExist.Meta.UnableLoadRep

Error message

JobEntryColumnsExist.Meta.UnableLoadRep

What it means

JobEntryColumnsExist.loadRep wraps any KettleDatabaseException from the repository while reading the entry's stored field names (row count plus per-row 'name' attributes) into this KettleException, identifying the entry by id_jobentry.

Solutions

  1. Inspect the chained KettleDatabaseException for the SQL cause
  2. Confirm r_jobentry_attribute rows exist for the given id_jobentry
  3. Re-open and re-save the entry in Spoon to rebuild its attributes
  4. Repair repository connectivity/permissions, then reload

Example fix

// before
entry.loadRep(rep, metaStore, ObjectId.parseString("bad-id"), databases, slaveServers);
// after
ObjectId id = rep.getJobEntryId(jobMeta, "columns-exist");
if (id != null) entry.loadRep(rep, metaStore, id, databases, slaveServers);
Defensive patterns

Strategy: try-catch

Validate before calling

if (id_jobentry == null) throw new IllegalStateException("Entry has no repository id");

Try / catch

try {
  entry.loadRep(rep, metaStore, id_jobentry, databases, slaveServers);
} catch (KettleException e) {
  log.error("Repo load failed for entry " + id_jobentry + ": " + e.getCause(), e);
}

Prevention

When it happens

Trigger: Calling loadRep when rep.getJobEntryAttributeString / count reads fail against the repository database for this entry's id.

Common situations: Repository rows missing after restore/migration; DB connection or permission failure; schema mismatch after upgrade; corrupted r_jobentry_attribute data.

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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/columnsexist/JobEntryColumnsExist.java:154

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      tablename = rep.getJobEntryAttributeString( id_jobentry, "tablename" );
      schemaname = rep.getJobEntryAttributeString( id_jobentry, "schemaname" );

      connection = rep.loadDatabaseMetaFromJobEntryAttribute( id_jobentry, "connection", "id_database", databases );

      // How many arguments?
      int argnr = rep.countNrJobEntryAttributes( id_jobentry, "name" );
      arguments = new String[argnr];

      // Read them all...
      for ( int a = 0; a < argnr; a++ ) {
        arguments[a] = rep.getJobEntryAttributeString( id_jobentry, a, "name" );
      }

    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( BaseMessages.getString( PKG, "JobEntryColumnsExist.Meta.UnableLoadRep", ""
        + id_jobentry ), dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "tablename", tablename );
      rep.saveJobEntryAttribute( id_job, getObjectId(), "schemaname", schemaname );

      rep.saveDatabaseMetaJobEntryAttribute( id_job, getObjectId(), "connection", "id_database", connection );

      // save the arguments...
      if ( arguments != null ) {
        for ( int i = 0; i < arguments.length; i++ ) {
          rep.saveJobEntryAttribute( id_job, getObjectId(), i, "name", arguments[i] );
        }
      }
    } catch ( KettleDatabaseException dbe ) {

View on GitHub (pinned to f3058517a1)