Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
fix(core): validate overridden properties by embeddables (#1172)
This PR fixes the issue when an embeddable might override a property in the parent class when used in conjunction with {object: false, prefix: false}.

Closes #1169
  • Loading branch information
dvlalex committed Dec 8, 2020
1 parent 6dd50fb commit 6629a08
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
1 change: 1 addition & 0 deletions packages/core/src/metadata/MetadataDiscovery.ts
Expand Up @@ -555,6 +555,7 @@ export class MetadataDiscovery {
for (const prop of Object.values(embeddable!.properties)) {
const prefix = embeddedProp.prefix === false ? '' : embeddedProp.prefix === true ? embeddedProp.name + '_' : embeddedProp.prefix;
const name = prefix + prop.name;
if (meta.properties[name] !== undefined) { throw new MetadataError(`Property ${meta.name}:${name} is being overwritten by its child property ${embeddedProp.name}:${name}. Consider using a prefix to overcome this issue.`); }
meta.properties[name] = Utils.copy(prop);
meta.properties[name].name = name;
meta.properties[name].embedded = [embeddedProp.name, prop.name];
Expand Down
38 changes: 37 additions & 1 deletion tests/embedded-entities.mysql.test.ts
@@ -1,4 +1,16 @@
import { assign, Embeddable, Embedded, Entity, Logger, MikroORM, PrimaryKey, Property, ReferenceType, wrap } from '@mikro-orm/core';
import {
assign,
Embeddable,
Embedded,
Entity,
Logger,
MetadataError,
MikroORM,
PrimaryKey,
Property,
ReferenceType,
wrap,
} from '@mikro-orm/core';
import { MySqlDriver } from '@mikro-orm/mysql';

@Embeddable()
Expand Down Expand Up @@ -72,6 +84,20 @@ class User {

}

@Entity()
class UserWithCity {

@PrimaryKey()
id!: number;

@Embedded({ object: false, prefix: false })
address1!: Address1;

@Property({ type: String })
city!: string;

}

describe('embedded entities in mysql', () => {

let orm: MikroORM<MySqlDriver>;
Expand Down Expand Up @@ -245,4 +271,14 @@ describe('embedded entities in mysql', () => {
});
});

test('should throw error with object&prefix false', async () => {
await expect(MikroORM.init({
entities: [Address1, UserWithCity],
dbName: `mikro_orm_test_embeddables`,
type: 'mysql',
port: 3307,
// eslint-disable-next-line no-console
})).rejects.toThrow(MetadataError);
});

});

0 comments on commit 6629a08

Please sign in to comment.