{"record":{"id":"47cd5a065902ab49","repo":"pentaho/pentaho-kettle","slug":"transmeta-log-errorsavingtransformationtorepository","errorCode":"TransMeta.Log.ErrorSavingTransformationToRepository","errorMessage":"Error saving transformation to repository!","messagePattern":"Error saving transformation to repository!","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryTransDelegate.java","lineNumber":405,"sourceCode":"      repository.unlockRepository();\n\n      // Perform a commit!\n      repository.commit();\n\n      transMeta.clearChanged();\n      if ( monitor != null ) {\n        monitor.worked( 1 );\n      }\n      if ( monitor != null ) {\n        monitor.done();\n      }\n    } catch ( KettleDatabaseException dbe ) {\n      // Oops, roll back!\n      repository.rollback();\n\n      log.logError( BaseMessages.getString( PKG, \"TransMeta.Log.ErrorSavingTransformationToRepository\" )\n        + Const.CR + dbe.getMessage() );\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"TransMeta.Log.ErrorSavingTransformationToRepository\" ), dbe );\n    }\n  }\n\n  /**\n   * Save the parameters of this transformation to the repository.\n   *\n   *\n   * @throws KettleException\n   *           Upon any error.\n   *\n   *\n   *           TODO: Move this code over to the Repository class for refactoring...\n   */\n  public void saveTransParameters( TransMeta transMeta ) throws KettleException {\n    String[] paramKeys = transMeta.listParameters();\n    for ( int idx = 0; idx < paramKeys.length; idx++ ) {\n      String desc = transMeta.getParameterDescription( paramKeys[idx] );","sourceCodeStart":387,"sourceCodeEnd":423,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryTransDelegate.java#L387-L423","documentation":"Wrapper thrown by saveTransformation when any inner repository operation raises a KettleDatabaseException. The repository transaction is rolled back first, the underlying DB error is logged, and a KettleException with this message plus the original cause is rethrown. It means the transformation save failed at the database layer and nothing was committed.","triggerScenarios":"Any KettleDatabaseException during save of transformation metadata: inserting/updating the transformation row, steps, hops, notes, slave servers, cluster schemas, dependencies, or parameters (e.g. constraint violations, connection loss, oversized columns).","commonSituations":"Repository database down or network dropped mid-save; schema mismatch after upgrading Pentaho/Kettle against an old repository; duplicate transformation name under repository-enforced uniqueness; field length exceeded by very long step descriptions.","solutions":["Inspect the cause (dbe) logged with this message for the real SQL/DB error and fix that root problem first.","Verify repository connectivity and credentials; retry the save after restoring the connection.","Confirm the repository tables exist and match the expected version (run repository upgrade/creation scripts).","Shorten oversized metadata (names, descriptions) that may exceed column limits."],"exampleFix":"// before\nrepository.save(transMeta, versionComment, monitor, null); // KettleException wraps DB failure\n// after\ntry {\n  repository.save(transMeta, versionComment, monitor, null);\n} catch (KettleException e) {\n  log.logError(\"Save failed, cause: \" + e.getCause(), e); // examine root KettleDatabaseException\n  if (repositoryConnected()) {\n    throw e;\n  }\n  // restore connection then retry\n}","handlingStrategy":"try-catch","validationCode":"// verify repository reachable before saving\nif (!repository.isConnected() || repository.getConnection().getConnection() == null) { repository.connect(user, password); }","typeGuard":null,"tryCatchPattern":"try { repository.save(transMeta, comment, monitor, null); } catch (KettleException e) { Throwable root = deepestCause(e); log.logError(\"Save failed: \" + root.getMessage(), root); throw e; }","preventionTips":["Always inspect the root cause (KettleDatabaseException) logged with this error","Keep repository DB credentials/permissions current","Validate metadata lengths (names/descriptions) against column limits before saving","Never ignore the rollback — re-save the whole transformation after a failure"],"tags":["repository","database","transaction-rollback","transformation-save"],"backgroundTag":"database-write-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}