typeorm: Update fails for entity with compound relation-based primary key on OneToMany relationship
Issue type:
[ ] question [x] bug report [ ] feature request [ ] documentation issue
Database system/driver:
[ ] cordova
[ ] mongodb
[ ] mssql
[ ] mysql / mariadb
[ ] oracle
[x] postgres
[ ] sqlite
[ ] sqljs
[ ] websql
TypeORM version:
[ ] latest
[x] @next
[ ] 0.x.x (or put your version here)
I have a OneToMany model where the ‘Many’ side has a compound primary key and leverages cascade inserts & updates. Creating the entity and cascade inserting works fine. However, when I attempt to update that same entity (with a trivial update or even saving an unmodified entity), I get an error like:
QueryFailedError: duplicate key value violates unique constraint “PK_…”
I did some step-through-debugging in my actual code and found that the issue seems to be around how the compound key ids are structured. Specifically, in OneToManySubjectBuilder.buildSubjectForRelation(), the ID comparisons inside
EntityMetadata .difference(relatedEntityDatabaseRelationIds, relatedPersistedEntityRelationIds)
fails because the identity in subject.databaseEntity is an object which as an id field when it should be a string.
I know that is confusing, but hopefully it gives us a starting point towards debugging - then again, I could be way off on the problem.
Models:
@Entity()
export class Role {
@PrimaryGeneratedColumn("uuid") id: string;
@Column()
title: string;
}
@Entity()
export class Event {
@PrimaryGeneratedColumn("uuid") id: string;
@Column()
title: string;
@OneToMany(type => EventRole, role => role.event, {
eager: true,
cascade: true,
})
roles: EventRole[];
}
@Entity()
export class EventRole {
@PrimaryColumn("uuid")
eventId: string;
@PrimaryColumn("uuid")
roleId: string;
@Column()
description: string;
@Column()
compensation: string;
@ManyToOne(type => Role, role => role.id, {
onDelete: "CASCADE",
})
role: Role;
@ManyToOne(type => Event, event => event.roles, {
onDelete: "CASCADE",
})
event: Event;
}
Test:
describe("github issues", () => {
let connections: Connection[];
before(async () => connections = await createTestingConnections({
entities: [__dirname + "/entity/*{.js,.ts}"],
enabledDrivers: ["postgres"],
schemaCreate: true,
dropSchema: true,
}));
beforeEach(() => reloadTestingDatabases(connections));
after(() => closeTestingConnections(connections));
it("Should update onetomany with compound primary key", () => Promise.all(connections.map(async connection => {
let role = new Role();
role.title = "The Boss";
role = await connection.manager.save(role);
let event = new Event();
event.title = "The Big Event";
let eventRole = new EventRole();
eventRole.description = "Be the boss";
eventRole.compensation = "All the money!";
eventRole.roleId = role.id;
event.roles = [eventRole];
event = await connection.manager.save(event);
event.roles[0].description = "Be a good boss";
// Fails with:
// QueryFailedError: duplicate key value violates unique constraint "PK_..."
event = await connection.manager.save(event);
})));
});
About this issue
- Original URL
- State: closed
- Created 6 years ago
- Comments: 15 (6 by maintainers)
Commits related to this issue
- Adding failing test case for GitHub issue #1926 — committed to csuich2/typeorm by deleted user 6 years ago
- Adding failing test case for GitHub issue #1926 — committed to csuich2/typeorm by deleted user 6 years ago
- Merge pull request #1927 from csuich2/github1926 Adding failing test case for GitHub issue #1926 — committed to typeorm/typeorm by pleerock 6 years ago
- temporary commented #1926 - fix in the future — committed to typeorm/typeorm by deleted user 6 years ago
- working "github issues > #1926 Update fails for entity with compound relation-based primary key on OneToMany relationship" — committed to typeorm/typeorm by bbakhrom 5 years ago
After npm install typeorm@next, I have also same issue like below errors. And the version of installed is typeorm@0.3.0-alpha.10.
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 15
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 22
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 22
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 29
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 39
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 45
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 45
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 14
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 21
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 22
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 22
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 28
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 33
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 38
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 44
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46 [13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46
[13:51:53] typescript: node_modules/typeorm/find-options/FindOptions.d.ts, line: 46