pentaho/pentaho-kettle · error · KettleException
Unable to load job entry of type 'create Folder' from the…
Error message
Unable to load job entry of type 'create Folder' from the repository for id_jobentry=${id_jobentry} What it means
Kettle wraps any KettleDatabaseException thrown while reading a 'create Folder' job entry's attributes (foldername, fail_of_folder_exists) from the repository in this KettleException. It preserves the underlying cause, so the real repository/database error is chained as the cause. It is a load-path failure in JobEntryCreateFolder.loadRep.
Solutions
- Check the chained cause (KettleException.getCause()) for the actual database error
- Verify repository connectivity and that id_jobentry exists in r_jobentry / r_jobentry_attribute
- Recreate the job entry in the repository (re-save the job) to regenerate its attributes
- If upgrading, run the repository upgrade scripts so the attribute table matches your Pentaho version
Example fix
// before
jobEntry.loadRep(rep, metaStore, idJobEntry, databases, slaveServers);
// after
try {
jobEntry.loadRep(rep, metaStore, idJobEntry, databases, slaveServers);
} catch (KettleException e) {
logError("Repo load failed for id_jobentry=" + idJobEntry + ": " + (e.getCause() != null ? e.getCause().getMessage() : e.getMessage()));
throw e;
} Defensive patterns
Strategy: try-catch
Validate before calling
// before loadRep
if (rep == null || id_jobentry == null) throw new IllegalArgumentException("Repository and id_jobentry required");
if (!rep.isConnected()) throw new IllegalStateException("Repository not connected"); Type guard
boolean isLoadFailure(KettleException e) {
return e.getMessage() != null && e.getMessage().contains("Unable to load job entry");
} Try / catch
try {
jobEntry.loadRep(rep, metaStore, idJobEntry, databases, slaveServers);
} catch (KettleException e) {
Throwable cause = e.getCause();
log.error("JobEntryCreateFolder load failed for id_jobentry=" + idJobEntry, cause);
if (cause instanceof KettleDatabaseException) {
// check repository connectivity / row existence, then retry or recreate entry
}
throw e;
} Prevention
- Always verify repository connectivity before loading jobs
- Keep repository schema upgraded to your Pentaho version
- Back up r_jobentry_attribute before repository maintenance
- Log getCause() so the real database error is visible
When it happens
Trigger: Calling JobEntryCreateFolder.loadRep with a repository that throws KettleDatabaseException on getJobEntryAttributeString/getJobEntryAttributeBoolean for the given id_jobentry — e.g. the row for that job entry id no longer exists, the repository connection is broken, or the r_jobentry_attribute table is missing/corrupt.
Common situations: Repository database was restored/migrated and job entry rows were lost; network drop to the repository DB mid-load; opening a job saved by a newer Pentaho version whose schema changed; shared repository metadata (metastore) is inaccessible.
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
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- ColumnExistsMeta.Exception.UnableToSaveStepInfo
- ColumnExistsMeta.Exception.UnexpectedErrorReadingStepInfo
- CreditCardValidatorMeta.Exception.UnableToSaveStepInfo
- CubeInputMeta.Exception.UnableToSaveStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/0f421cd5f7fe9fb7.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/createfolder/JobEntryCreateFolder.java:105
public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,
Repository rep, IMetaStore metaStore ) throws KettleXMLException {
try {
super.loadXML( entrynode, databases, slaveServers );
foldername = XMLHandler.getTagValue( entrynode, "foldername" );
failOfFolderExists = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "fail_of_folder_exists" ) );
} catch ( KettleXMLException xe ) {
throw new KettleXMLException( "Unable to load job entry of type 'create folder' from XML node", xe );
}
}
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
foldername = rep.getJobEntryAttributeString( id_jobentry, "foldername" );
failOfFolderExists = rep.getJobEntryAttributeBoolean( id_jobentry, "fail_of_folder_exists" );
} catch ( KettleException dbe ) {
throw new KettleException(
"Unable to load job entry of type 'create Folder' from the repository for id_jobentry=" + id_jobentry,
dbe );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
try {
rep.saveJobEntryAttribute( id_job, getObjectId(), "foldername", foldername );
rep.saveJobEntryAttribute( id_job, getObjectId(), "fail_of_folder_exists", failOfFolderExists );
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( "Unable to save job entry of type 'create Folder' to the repository for id_job="
+ id_job, dbe );
}
}
public void setFoldername( String foldername ) {
this.foldername = foldername;
}View on GitHub (pinned to f3058517a1)