pentaho/pentaho-kettle · error · KettleException

Unable to save repository element [" + element + "]

Error message

Unable to save repository element [" + element + "]

What it means

Generic wrapper thrown by PurRepository.saveRepositoryElement: any Exception raised while saving an element (including the unsupported-class error above or failures inside the individual save methods) is rethrown as a KettleException with the original as cause.

Solutions

  1. Inspect the cause chain (getCause()) for the real underlying error
  2. Verify repository connectivity and permissions before saving
  3. Fix the root cause indicated by the wrapped exception
Defensive patterns

Strategy: try-catch

Try / catch

try {
  repository.save(element, comment, calendar, monitor);
} catch (KettleException e) {
  Throwable root = e;
  while (root.getCause() != null) root = root.getCause();
  log.error("Save of " + element + " failed: " + root.getMessage(), e);
}

Prevention

When it happens

Trigger: Any failure inside saveRepositoryElement's try block — e.g. saveDatabaseMeta, saveClusterSchema, savePartitionSchema throwing due to repository connectivity, permission issues, or unsupported element type.

Common situations: Repository connectivity drops mid-save; insufficient permissions in the Pentaho repository; saving an element whose dependent objects are missing; server-side validation failures.

Related errors


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

Appendix: source

Thrown at plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java:2203

          break;
        case DATABASE:
          saveDatabaseMeta( element, versionComment, versionDate );
          break;
        case SLAVE_SERVER:
          saveSlaveServer( element, versionComment, versionDate );
          break;
        case CLUSTER_SCHEMA:
          saveClusterSchema( element, versionComment, versionDate );
          break;
        case PARTITION_SCHEMA:
          savePartitionSchema( element, versionComment, versionDate );
          break;
        default:
          throw new KettleException(
            "It's not possible to save Class [" + element.getClass().getName() + "] to the repository" );
      }
    } catch ( Exception e ) {
      throw new KettleException( "Unable to save repository element [" + element + "]", e );
    }
  }

  private boolean isRenamed( final RepositoryElementInterface element, final RepositoryFile file )
    throws KettleException {
    if ( element.getObjectId() == null ) {
      return false; // never been saved
    }
    String filename = element.getName();
    switch ( element.getRepositoryElementType() ) {
      case TRANSFORMATION:
        filename += RepositoryObjectType.TRANSFORMATION.getExtension();
        break;
      case JOB:
        filename += RepositoryObjectType.JOB.getExtension();
        break;
      case DATABASE:
        filename += RepositoryObjectType.DATABASE.getExtension();

View on GitHub (pinned to f3058517a1)