typescript - TypeORM cykliskt beroende med OneToOne och ManyToOne
Jag har dessa två enheter som är relaterade till varandra:
@Entity()
export class Message {
// ... other columns ...
@OneToMany(() => Action, action => action.message, { eager: true, cascade: true })
public actions: Action[];
}
@Entity()
export class Action {
// ... other columns ...
@ManyToOne(() => Message, message => message.actions, { nullable: false })
public message?: Message;
}
Men jag vill registrera på meddelandeentiteten när användaren utför en åtgärd. Jag försöker lägga till en extra relation till meddelandet på detta sätt:
@Entity()
export class Message {
// ... other columns ...
@OneToMany(() => Action, action => action.message, { eager: true, cascade: true })
public actions: Action[];
@OneToOne(() => Action, { nullable: true })
@JoinColumn()
public action_taken: Action;
}
Men när jag försöker spara ett nytt meddelande med actions-relationen ifylld (försöker spara dem alla på en gång med cascade: true), får jag följande fel:
TypeORMError: Cyclic dependency: "Action"
at new TypeORMError (/app/node_modules/typeorm/error/TypeORMError.js:9:28)
at visit (/app/node_modules/typeorm/persistence/SubjectTopoligicalSorter.js:144:23)
at visit (/app/node_modules/typeorm/persistence/SubjectTopoligicalSorter.js:160:21)
at visit (/app/node_modules/typeorm/persistence/SubjectTopoligicalSorter.js:160:21)
at SubjectTopoligicalSorter.toposort (/app/node_modules/typeorm/persistence/SubjectTopoligicalSorter.js:139:17)
at SubjectTopoligicalSorter.sort (/app/node_modules/typeorm/persistence/SubjectTopoligicalSorter.js:53:45)
at SubjectExecutor.<anonymous> (/app/node_modules/typeorm/persistence/SubjectExecutor.js:99:124)
at step (/app/node_modules/tslib/tslib.js:143:27)
at Object.next (/app/node_modules/tslib/tslib.js:124:57)
at /app/node_modules/tslib/tslib.js:117:75
Att sätta cascade: false kastar inte felet, men då sparas inte heller de relaterade posterna.
Vad missar jag? Finns det ett sätt för mig att fortfarande ha cascade: true och ha en dubbel relation till en entitet? Eller måste jag manuellt spara de relaterade posterna?
Svar #1
Hade detta problem, fungerade bra på nest CLI men gav problem när jag använde serverless och webpack. Typeorm fungerar inte bra med webpack. Jag använde repository.save (entity) och det misslyckades alltid med cyklisk beroende.
Efter att ha bytt till
repository.createQueryBuilder()
.insert()
.values(data)
.execute();
Detta fel har rensats. Jag rekommenderar verkligen att prova att ändra repository-metoden, eftersom save()-metoden väntar på hela enhetsuppsättningen och createQueryBuilder() tar enhetsvärdena och gör om dem till strängvärden, vilket skapar en vanlig fråga.
Svar #2
Hade det här problemet, i en @ManyToOne @OneToMany relation, det kan lösas genom att ta bort sidan av relationen som inte har cascade. Felet försvinner, och kaskaden fungerar.
