From 475e2a33d1a2682cc9168269e36f14b10b6fe7fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ad=C3=A1mek?= Date: Sun, 2 Apr 2023 19:48:34 +0200 Subject: [PATCH] fix(core): ensure correct FK as PK identity map key --- packages/core/src/entity/EntityFactory.ts | 2 +- packages/core/src/metadata/EntitySchema.ts | 1 + packages/core/src/metadata/MetadataDiscovery.ts | 1 + packages/core/src/typings.ts | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core/src/entity/EntityFactory.ts b/packages/core/src/entity/EntityFactory.ts index d22cbaebe90f..678ca99bb2ce 100644 --- a/packages/core/src/entity/EntityFactory.ts +++ b/packages/core/src/entity/EntityFactory.ts @@ -256,7 +256,7 @@ export class EntityFactory { private findEntity(data: EntityData, meta: EntityMetadata, options: FactoryOptions): T | undefined { const schema = this.driver.getSchemaName(meta, options); - if (!meta.compositePK && !meta.getPrimaryProps()[0]?.customType) { + if (meta.simplePK) { return this.unitOfWork.getById(meta.name!, data[meta.primaryKeys[0] as string] as Primary, schema); } diff --git a/packages/core/src/metadata/EntitySchema.ts b/packages/core/src/metadata/EntitySchema.ts index e2f0f4ca694e..61a4564141d5 100644 --- a/packages/core/src/metadata/EntitySchema.ts +++ b/packages/core/src/metadata/EntitySchema.ts @@ -304,6 +304,7 @@ export class EntitySchema { if (pks.length > 0) { this._meta.primaryKeys = pks.map(prop => prop.name); this._meta.compositePK = pks.length > 1; + this._meta.simplePK = !this._meta.compositePK && pks[0].reference === ReferenceType.SCALAR && !pks[0].customType; } if (pks.length === 1 && pks[0].type === 'number') { diff --git a/packages/core/src/metadata/MetadataDiscovery.ts b/packages/core/src/metadata/MetadataDiscovery.ts index ecc3a5bbcba7..4d0feebd6be9 100644 --- a/packages/core/src/metadata/MetadataDiscovery.ts +++ b/packages/core/src/metadata/MetadataDiscovery.ts @@ -487,6 +487,7 @@ export class MetadataDiscovery { this.initRelation(prop); } + meta.simplePK = pks.length === 1 && pks[0].reference === ReferenceType.SCALAR && !pks[0].customType; meta.serializedPrimaryKey = this.platform.getSerializedPrimaryKeyField(meta.primaryKeys[0]); const serializedPKProp = meta.properties[meta.serializedPrimaryKey]; diff --git a/packages/core/src/typings.ts b/packages/core/src/typings.ts index 7f093e772565..4d363499d3ad 100644 --- a/packages/core/src/typings.ts +++ b/packages/core/src/typings.ts @@ -519,6 +519,7 @@ export interface EntityMetadata { collection: string; path: string; primaryKeys: (keyof T & string)[]; + simplePK: boolean; // whether the PK can be compared via `===`, e.g. simple scalar without a custom mapped type compositePK: boolean; versionProperty: keyof T & string; concurrencyCheckKeys: Set;