TypeORM自定义多对多关联无法完整加载关联数据求助
问题描述
我在Business与Salesperson之间通过中间表BusinessSalesperson创建了自定义多对多关联,相关代码如下:
// Business 实体 @OneToMany(() => BusinessSalesperson, (bsp) => bsp.business, { nullable: false, onDelete: 'CASCADE', }) salespersons: Salesperson[] // Salesperson 实体 @OneToMany(() => BusinessSalesperson, (bsp) => bsp.salesperson, { nullable: false, onDelete: 'CASCADE', }) business: Business[] // BusinessSalesperson 实体 @ManyToOne(() => Salesperson, (sp) => sp.business, { eager: true, nullable: false, onDelete: 'CASCADE', }) @JoinColumn({ name: 'salespersonid' }) salesperson: Salesperson @ManyToOne(() => Business, (b) => b.salespersons, { eager: true, nullable: false, onDelete: 'CASCADE', }) @JoinColumn({ name: 'businessid' }) business: Business;
在服务中执行以下查询语句:
const businesses = this.dataSource.createEntityManager().find(Business, {relations: {salespersons: true, businessSalespersons: { salesperson: true} } });
原本期望获取完整的关联数据,但返回的Business对象中,Salesperson字段为null,具体结果如下:
Business { businessid: 1365991, companyLegalName: 'SCG', businessName: 'SCG', salespersons: [ BusinessSalesperson { salespersonId: 549, businessId: 1365991, administrator: false, salesperson: null, business: [Business] } ], businessSalespersons: [ BusinessSalesperson { salespersonId: 549, businessId: 1365991, administrator: false, salesperson: null, business: [Business] } ] }
请问我哪里配置出错了?
问题分析与解决
1. 实体关联字段类型不匹配
Business类中,@OneToMany注解指向的是中间表BusinessSalesperson实体,因此salespersons字段的类型应该是BusinessSalesperson[],而非Salesperson[];同理,Salesperson类中,@OneToMany注解指向的也是BusinessSalesperson实体,关联字段的类型必须是BusinessSalesperson[],不能直接设为Business[]。类型不匹配会导致TypeORM无法正确映射关联关系,进而导致关联数据无法加载。
修正后的实体代码:
// Business 实体 @OneToMany(() => BusinessSalesperson, (bsp) => bsp.business, { nullable: false, onDelete: 'CASCADE', }) salespersons: BusinessSalesperson[] // 修正为中间表实体数组 // Salesperson 实体 @OneToMany(() => BusinessSalesperson, (bsp) => bsp.salesperson, { nullable: false, onDelete: 'CASCADE', }) businessSalespersons: BusinessSalesperson[] // 修正字段名(语义更清晰)及类型
2. 中间表反向关联指向错误
BusinessSalesperson实体中,@ManyToOne的第二个参数需要对应到关联实体中定义的@OneToMany字段。比如Salesperson实体的关联字段现在是businessSalespersons,那么中间表中对应Salesperson的关联需要调整指向:
// BusinessSalesperson 实体中对应Salesperson的关联 @ManyToOne(() => Salesperson, (sp) => sp.businessSalespersons, { eager: true, nullable: false, onDelete: 'CASCADE', }) @JoinColumn({ name: 'salespersonid' }) salesperson: Salesperson
3. 查询关联配置错误
原查询中businessSalespersons并非Business实体的字段,应该使用修正后的salespersons字段,并正确嵌套关联以加载Salesperson数据:
const businesses = this.dataSource.createEntityManager().find(Business, { relations: { salespersons: { salesperson: true } } });
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

