{"record":{"id":"bd8f7336cc45c520","repo":"n8n-io/n8n","slug":"referenced-column-joincolumn-referencedcolumnnam-bd8f73","errorCode":null,"errorMessage":"Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.inverseEntityMetadata.name}","messagePattern":"Referenced column (.+?) was not found in entity (.+?)","errorType":"exception","errorClass":"TypeORMError","httpStatus":null,"severity":"error","filePath":"packages/@n8n/typeorm/src/metadata-builder/JunctionEntityMetadataBuilder.ts","lineNumber":261,"sourceCode":"\t * Collects inverse referenced columns from the given join column args.\n\t */\n\tprotected collectInverseReferencedColumns(\n\t\trelation: RelationMetadata,\n\t\tjoinTable: JoinTableMetadataArgs,\n\t): ColumnMetadata[] {\n\t\tconst hasInverseJoinColumns = !!joinTable.inverseJoinColumns;\n\t\tconst hasAnyInverseReferencedColumnName = hasInverseJoinColumns\n\t\t\t? joinTable.inverseJoinColumns!.find((joinColumn) => !!joinColumn.referencedColumnName)\n\t\t\t: false;\n\t\tif (!hasInverseJoinColumns || (hasInverseJoinColumns && !hasAnyInverseReferencedColumnName)) {\n\t\t\treturn relation.inverseEntityMetadata.primaryColumns;\n\t\t} else {\n\t\t\treturn joinTable.inverseJoinColumns!.map((joinColumn) => {\n\t\t\t\tconst referencedColumn = relation.inverseEntityMetadata.ownColumns.find(\n\t\t\t\t\t(column) => column.propertyName === joinColumn.referencedColumnName,\n\t\t\t\t);\n\t\t\t\tif (!referencedColumn)\n\t\t\t\t\tthrow new TypeORMError(\n\t\t\t\t\t\t`Referenced column ${joinColumn.referencedColumnName} was not found in entity ${relation.inverseEntityMetadata.name}`,\n\t\t\t\t\t);\n\n\t\t\t\treturn referencedColumn;\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected changeDuplicatedColumnNames(\n\t\tjunctionColumns: ColumnMetadata[],\n\t\tinverseJunctionColumns: ColumnMetadata[],\n\t) {\n\t\tjunctionColumns.forEach((junctionColumn) => {\n\t\t\tinverseJunctionColumns.forEach((inverseJunctionColumn) => {\n\t\t\t\tif (junctionColumn.givenDatabaseName === inverseJunctionColumn.givenDatabaseName) {\n\t\t\t\t\tconst junctionColumnName =\n\t\t\t\t\t\tthis.connection.namingStrategy.joinTableColumnDuplicationPrefix(\n\t\t\t\t\t\t\tjunctionColumn.propertyName,","sourceCodeStart":243,"sourceCodeEnd":279,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/typeorm/src/metadata-builder/JunctionEntityMetadataBuilder.ts#L243-L279","documentation":"Symmetric to the owning-side check, this resolves `inverseJoinColumns[].referencedColumnName` against `relation.inverseEntityMetadata.ownColumns` (note: ownColumns only, not embedded/inherited columns). If the referenced property is not found directly on the inverse entity, the junction cannot be built and TypeORM throws.","triggerScenarios":"Declaring `@JoinTable({ inverseJoinColumn: { name: 'tag_id', referencedColumnName: 'slug' } })` where the inverse entity has no top-level `slug` property (it might be in a @Embedded column, or only on a different entity, or simply mistyped).","commonSituations":"The inverse entity uses an embedded primary key whose properties are not in `ownColumns`. Renaming the inverse entity's PK without updating the @JoinTable. Confusing the joinColumns vs inverseJoinColumns slots.","solutions":["Confirm `referencedColumnName` matches a column directly on the INVERSE entity (a @PrimaryColumn/@Column property, not one nested inside an @Embedded).","Move the referenced column out of an embeddable onto the entity itself if you must reference it from a join table.","Remove explicit `referencedColumnName` to default to the inverse entity's primary key."],"exampleFix":"// before — 'slug' is not a top-level column on Tag\n@JoinTable({\n  joinColumn: { name: 'post_id', referencedColumnName: 'id' },\n  inverseJoinColumn: { name: 'tag_id', referencedColumnName: 'slug' },\n})\n\n// after\n@JoinTable({\n  joinColumn: { name: 'post_id', referencedColumnName: 'id' },\n  inverseJoinColumn: { name: 'tag_id', referencedColumnName: 'id' },\n})","handlingStrategy":"validation","validationCode":"for (const m of dataSource.entityMetadatas) {\n  for (const r of m.manyToManyRelations) {\n    if (!r.joinTable?.inverseJoinColumns) continue;\n    const inverseOwn = r.inverseEntityMetadata.ownColumns.map(c => c.propertyName);\n    for (const jc of r.joinTable.inverseJoinColumns) {\n      if (jc.referencedColumnName && !inverseOwn.includes(jc.referencedColumnName)) {\n        throw new Error(`inverseJoinColumn references unknown column ${jc.referencedColumnName} on ${r.inverseEntityMetadata.name}`);\n      }\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":"try { await dataSource.initialize(); } catch (e) { if (e instanceof TypeORMError && /Referenced column.*was not found in entity/) { /* inspect inverseJoinColumns + inverse entity ownColumns */ } throw e; }","preventionTips":["Remember the inverse side is resolved against `ownColumns` only — embeddeds won't match.","Keep @JoinTable declarations on exactly one side of a @ManyToMany.","Renaming an inverse-entity property? Update inverseJoinColumn.referencedColumnName the same commit."],"tags":["typeorm","relations","many-to-many","join-table","schema-validation"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}