{"record":{"id":"89a19c1ea6416f03","repo":"pentaho/pentaho-kettle","slug":"jobentryzipfile-unableloadjobentryrep","errorCode":null,"errorMessage":"JobEntryZipFile.UnableLoadJobEntryRep","messagePattern":"JobEntryZipFile\\.UnableLoadJobEntryRep","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/zipfile/JobEntryZipFile.java","lineNumber":216,"sourceCode":"      compressionRate = (int) rep.getJobEntryAttributeInteger( id_jobentry, \"compressionrate\" );\n      ifZipFileExists = (int) rep.getJobEntryAttributeInteger( id_jobentry, \"ifzipfileexists\" );\n      afterZip = (int) rep.getJobEntryAttributeInteger( id_jobentry, \"afterzip\" );\n      wildCard = rep.getJobEntryAttributeString( id_jobentry, \"wildcard\" );\n      excludeWildCard = rep.getJobEntryAttributeString( id_jobentry, \"wildcardexclude\" );\n      sourceDirectory = rep.getJobEntryAttributeString( id_jobentry, \"sourcedirectory\" );\n      movetoDirectory = rep.getJobEntryAttributeString( id_jobentry, \"movetodirectory\" );\n      addFileToResult = rep.getJobEntryAttributeBoolean( id_jobentry, \"addfiletoresult\" );\n      isFromPrevious = rep.getJobEntryAttributeBoolean( id_jobentry, \"isfromprevious\" );\n      createParentFolder = rep.getJobEntryAttributeBoolean( id_jobentry, \"createparentfolder\" );\n      addDate = rep.getJobEntryAttributeBoolean( id_jobentry, \"adddate\" );\n      addTime = rep.getJobEntryAttributeBoolean( id_jobentry, \"addtime\" );\n      specifyFormat = rep.getJobEntryAttributeBoolean( id_jobentry, \"SpecifyFormat\" );\n      dateTimeFormat = rep.getJobEntryAttributeString( id_jobentry, \"date_time_format\" );\n      createMoveToDirectory = rep.getJobEntryAttributeBoolean( id_jobentry, \"createMoveToDirectory\" );\n      includingSubFolders = rep.getJobEntryAttributeBoolean( id_jobentry, \"include_subfolders\" );\n      storedSourcePathDepth = rep.getJobEntryAttributeString( id_jobentry, \"stored_source_path_depth\" );\n    } catch ( KettleException dbe ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"JobEntryZipFile.UnableLoadJobEntryRep\", \"\"\n        + id_jobentry ), dbe );\n    }\n  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {\n    try {\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"zipfilename\", zipFilename );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"compressionrate\", compressionRate );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"ifzipfileexists\", ifZipFileExists );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"afterzip\", afterZip );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"wildcard\", wildCard );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"wildcardexclude\", excludeWildCard );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"sourcedirectory\", sourceDirectory );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"movetodirectory\", movetoDirectory );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"addfiletoresult\", addFileToResult );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"isfromprevious\", isFromPrevious );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"createparentfolder\", createParentFolder );\n      rep.saveJobEntryAttribute( id_job, getObjectId(), \"addtime\", addTime );","sourceCodeStart":198,"sourceCodeEnd":234,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/zipfile/JobEntryZipFile.java#L198-L234","documentation":"JobEntryZipFile.loadRep() throws this KettleException when reading the zip job entry's attributes from the repository fails. The message includes the job entry id and the original KettleException (typically KettleDatabaseException) as cause.","triggerScenarios":"Calling loadRep against an unavailable/corrupt repository, an invalid id_jobentry, or when rep.getJobEntryAttributeString/Boolean throws a KettleDatabaseException for attributes like 'SpecifyFormat', 'date_time_format', 'stored_source_path_depth'.","commonSituations":"Repository DB connectivity loss; schema drift after PDI upgrade (missing r_jobentry_attribute columns/rows); loading a deleted entry id; DB permission changes.","solutions":["Verify repository DB connectivity and that id_jobentry exists in r_jobentry_attribute","Check the cause exception for the underlying SQL/database error","Run repository upgrade scripts for your PDI version","Re-save the job entry in Spoon to repopulate missing attribute rows"],"exampleFix":"// before: loading a deleted entry\njobEntry.loadRep( rep, metaStore, deletedId, databases, slaveServers );\n// after: verify existence first\nif ( rep.getJobEntry( id_jobentry ) == null ) { throw new KettleException( \"Job entry not found\" ); }\njobEntry.loadRep( rep, metaStore, id_jobentry, databases, slaveServers );","handlingStrategy":"try-catch","validationCode":"// verify entry exists before loadRep\nObjectId id = rep.findJobEntryId( entryName, idJob );\nif ( id == null ) throw new KettleException( \"Job entry not found in repository\" );","typeGuard":null,"tryCatchPattern":"try {\n  jobEntry.loadRep( rep, metaStore, id_jobentry, databases, slaveServers );\n} catch ( KettleException e ) {\n  logError( \"Failed to load zip entry from repo \" + id_jobentry + \": \" + e.getCause() );\n  // retry after reconnect for transient DB errors\n}","preventionTips":["Reconnect to the repository after long-running operations","Run schema migration scripts on upgrade","Confirm ids exist before loading (no stale references)"],"tags":["database","repository","pdi","persistence"],"backgroundTag":"database-read-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"}