Skip to content

Commit

Permalink
fix: prefix relation id columns contained in embedded entities (#6977) (
Browse files Browse the repository at this point in the history
#7432)

* fix: prefix relation id columns contained in embedded entities (#6977)

Searches embedded entity columns for relation ID column if relation column
is in embedded entity. If not found, creates new relation ID with embedded
metadata set to match the relation column.

fixes: #2254
fixes: #3132
fixes: #3226
fixes: #6977

* test: prefix subcounters sub-entity with "sub" to fit in 30 character identifier for oracle

Problem introduced with #6981
  • Loading branch information
nebkat committed Feb 16, 2022
1 parent 3c264ac commit c3ea632
Show file tree
Hide file tree
Showing 13 changed files with 54 additions and 10 deletions.
4 changes: 3 additions & 1 deletion src/metadata-builder/RelationJoinColumnBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,11 +135,13 @@ export class RelationJoinColumnBuilder {
});
const joinColumnName = joinColumnMetadataArg ? joinColumnMetadataArg.name : this.connection.namingStrategy.joinColumnName(relation.propertyName, referencedColumn.propertyName);

let relationalColumn = relation.entityMetadata.ownColumns.find(column => column.databaseName === joinColumnName);
const relationalColumns = relation.embeddedMetadata ? relation.embeddedMetadata.columns : relation.entityMetadata.ownColumns;
let relationalColumn = relationalColumns.find(column => column.databaseNameWithoutPrefixes === joinColumnName);
if (!relationalColumn) {
relationalColumn = new ColumnMetadata({
connection: this.connection,
entityMetadata: relation.entityMetadata,
embeddedMetadata: relation.embeddedMetadata,
args: {
target: "",
mode: "virtual",
Expand Down
2 changes: 1 addition & 1 deletion test/functional/entity-metadata/entity/Counters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export class Counters {
@Column()
favorites: number;

@Column(() => Subcounters)
@Column(() => Subcounters, {prefix: "sub"})
subcounters: Subcounters;

@ManyToMany(type => User, user => user.likedPosts)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export class Counters {
@Column()
favorites: number;

@Column(() => Subcounters)
@Column(() => Subcounters, {prefix: "sub"})
subcounters: Subcounters;

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export class Counters {
@JoinTable({ name: "counter_categories" })
categories: Category[];

@Column(() => Subcounters)
@Column(() => Subcounters, {prefix: "sub"})
subcntrs: Subcounters;

categoryIds: number[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export class Counters {
@ManyToOne(type => Category)
category: Category;

@Column(() => Subcounters)
@Column(() => Subcounters, {prefix: "sub"})
subcounters: Subcounters;

categoryId: number[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export class Counters {
@ManyToOne(type => Category, category => category.posts)
category: Category;

@Column(() => Subcounters)
@Column(() => Subcounters, {prefix: "sub"})
subcounters: Subcounters;

categoryId: number;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export class Counters {
@OneToMany(type => Category, category => category.post)
categories: Category[];

@Column(() => Subcounters)
@Column(() => Subcounters, {prefix: "sub"})
subcounters: Subcounters;

categoryIds: number[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export class Counters {
@OneToMany(type => Category, category => category.posts)
categories: Category[];

@Column(() => Subcounters)
@Column(() => Subcounters, {prefix: "sub"})
subcounters: Subcounters;

categoryIds: number[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export class Counters {
@JoinColumn()
category: Category;

@Column(() => Subcounters)
@Column(() => Subcounters, {prefix: "sub"})
subcounters: Subcounters;

categoryId: number[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export class Counters {
@JoinColumn()
category: Category;

@Column(() => Subcounters)
@Column(() => Subcounters, {prefix: "sub"})
subcounters: Subcounters;

categoryId: number;
Expand Down
9 changes: 9 additions & 0 deletions test/github-issues/6977/entity/Embedded.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Column, ManyToOne } from '../../../../src';
import { User } from './User';

export class Embedded {
@ManyToOne(() => User) relationUser1: User;

@ManyToOne(() => User) relationUser2: User;
@Column() relationUser2Id: number;
}
9 changes: 9 additions & 0 deletions test/github-issues/6977/entity/User.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Column, Entity, PrimaryGeneratedColumn } from '../../../../src';
import { Embedded } from './Embedded';

@Entity()
export class User {
@PrimaryGeneratedColumn() id: number;

@Column(() => Embedded) embedded: Embedded;
}
24 changes: 24 additions & 0 deletions test/github-issues/6977/issue-6977.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { closeTestingConnections, createTestingConnections, reloadTestingDatabases } from "../../utils/test-utils";
import { Connection } from "../../../src";
import { expect } from "chai";

import { Embedded } from "./entity/Embedded";
import { User } from "./entity/User";

describe("github issues > #6977 Relation columns in embedded entities are not prefixed", () => {

let connections: Connection[];
before(async () => connections = await createTestingConnections({
entities: [User, Embedded],
}));
beforeEach(() => reloadTestingDatabases(connections));
after(() => closeTestingConnections(connections));

it("should correctly assign foreign key columns in embedded entity", () => Promise.all(connections.map(async connection => {
const columns = connection.entityMetadatas.find(entity => entity.name === "User")!.columns;
expect(columns.length).to.equal(3); // id, embeddedRelationuser1id, embeddedRelationuser2id
expect(columns.some(column => column.databaseName === "id")).to.be.true;
expect(columns.some(column => column.databaseName === "embeddedRelationuser1id")).to.be.true;
expect(columns.some(column => column.databaseName === "embeddedRelationuser2id")).to.be.true;
})));
});

0 comments on commit c3ea632

Please sign in to comment.