{"record":{"id":"8fbd248fb5360740","repo":"n8n-io/n8n","slug":"referenced-column-joincolumn-referencedcolumnnam-8fbd24","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/RelationJoinColumnBuilder.ts","lineNumber":133,"sourceCode":"\t): ColumnMetadata[] {\n\t\tconst hasAnyReferencedColumnName = joinColumns.find(\n\t\t\t(joinColumnArgs) => !!joinColumnArgs.referencedColumnName,\n\t\t);\n\t\tconst manyToOneWithoutJoinColumn = joinColumns.length === 0 && relation.isManyToOne;\n\t\tconst hasJoinColumnWithoutAnyReferencedColumnName =\n\t\t\tjoinColumns.length > 0 && !hasAnyReferencedColumnName;\n\n\t\tif (manyToOneWithoutJoinColumn || hasJoinColumnWithoutAnyReferencedColumnName) {\n\t\t\t// covers case3 and case1\n\t\t\treturn relation.inverseEntityMetadata.primaryColumns;\n\t\t} else {\n\t\t\t// cases with referenced columns defined\n\t\t\treturn joinColumns.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); // todo: can we also search in relations?\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\t/**\n\t * Collects columns from the given join column args.\n\t */\n\tprivate collectColumns(\n\t\tjoinColumns: JoinColumnMetadataArgs[],\n\t\trelation: RelationMetadata,\n\t\treferencedColumns: ColumnMetadata[],\n\t): ColumnMetadata[] {\n\t\treturn referencedColumns.map((referencedColumn) => {\n\t\t\t// in the case if relation has join column with only name set we need this check","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/typeorm/src/metadata-builder/RelationJoinColumnBuilder.ts#L115-L151","documentation":"For @ManyToOne / @OneToOne relations, `RelationJoinColumnBuilder` resolves each `@JoinColumn({ referencedColumnName })` against `relation.inverseEntityMetadata.ownColumns`. If the named column is not a directly-declared column on the inverse entity, TypeORM cannot build the foreign key and throws. The code comment notes it does not search inside other relations.","triggerScenarios":"Writing `@ManyToOne(() => User) @JoinColumn({ referencedColumnName: 'email' })` when `User` has no top-level `email` column (e.g. email lives in an embedded profile, or the column is named `emailAddress`).","commonSituations":"Referencing a unique column that is actually defined on a subclass or embedded entity. Renaming the inverse column and forgetting the @JoinColumn. Typing the referencedColumnName.","solutions":["Ensure `referencedColumnName` is a real top-level column on the inverse entity (and is unique — FK targets must be unique/primary).","If the target column lives in an @Embedded, move it onto the entity directly so it appears in `ownColumns`.","Drop `referencedColumnName` to let TypeORM reference the inverse entity's primary key automatically."],"exampleFix":"// before\n@ManyToOne(() => User)\n@JoinColumn({ referencedColumnName: 'email' })\nauthor: User;  // User has no `email` column\n\n// after — reference a real unique column (or omit it)\n@ManyToOne(() => User)\n@JoinColumn({ referencedColumnName: 'id' })\nauthor: User;","handlingStrategy":"validation","validationCode":"for (const m of dataSource.entityMetadatas) {\n  for (const r of m.relations) {\n    if (!r.joinColumns?.length) continue;\n    const invOwn = r.inverseEntityMetadata.ownColumns.map(c => c.propertyName);\n    for (const jc of r.joinColumns) {\n      if (jc.referencedColumnName && !invOwn.includes(jc.referencedColumnName)) {\n        throw new Error(`${m.name}#${r.propertyName}: referencedColumnName ${jc.referencedColumnName} not 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/) { /* inspect @JoinColumn referencedColumnName vs inverse entity */ } throw e; }","preventionTips":["Point `referencedColumnName` at a unique/primary column directly declared on the inverse entity.","Avoid embedding the target column inside an @Embedded; promote it if you must reference it.","Omit `referencedColumnName` when you mean the inverse entity's PK."],"tags":["typeorm","relations","many-to-one","join-column","schema-validation"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}