如何在TypeORM 0.3+的多对多表中设置两列为联合主键?
在TypeORM 0.3+中配置多对多关联表双列主键
TypeORM 0.3+版本废弃了旧版中{ primary: true }的关联主键配置方式,要实现双关联列作为主键,需要自定义中间表实体并显式标记主键列,具体步骤如下:
1. 创建自定义中间表实体
以User和Role的多对多关联为例,中间表命名为UserRole,代码如下:
import { Entity, PrimaryColumn, ManyToOne, JoinColumn } from "typeorm"; import { User } from "./User"; import { Role } from "./Role"; @Entity() export class UserRole { // 标记两个关联列为主键 @PrimaryColumn() userId: number; @PrimaryColumn() roleId: number; // 关联User实体 @ManyToOne(() => User, user => user.userRoles, { onDelete: "CASCADE" }) @JoinColumn({ name: "userId" }) user: User; // 关联Role实体 @ManyToOne(() => Role, role => role.userRoles, { onDelete: "CASCADE" }) @JoinColumn({ name: "roleId" }) role: Role; }
2. 在主实体中关联中间表
在User和Role实体中,通过@OneToMany关联中间表,也可以保留@ManyToMany并指定through属性来直接关联对方实体:
User实体示例
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, OneToMany, JoinTable } from "typeorm"; import { Role } from "./Role"; import { UserRole } from "./UserRole"; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; // 关联中间表实体 @OneToMany(() => UserRole, userRole => userRole.user) userRoles: UserRole[]; // 直接关联Role实体(可选) @ManyToMany(() => Role, role => role.users) @JoinTable({ name: "user_role", // 需与中间表实体的表名一致 joinColumn: { name: "userId", referencedColumnName: "id" }, inverseJoinColumn: { name: "roleId", referencedColumnName: "id" } }) roles: Role[]; }
Role实体示例
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, OneToMany } from "typeorm"; import { User } from "./User"; import { UserRole } from "./UserRole"; @Entity() export class Role { @PrimaryGeneratedColumn() id: number; @Column() name: string; // 关联中间表实体 @OneToMany(() => UserRole, userRole => userRole.role) userRoles: UserRole[]; // 直接关联User实体(可选) @ManyToMany(() => User, user => user.roles) users: User[]; }
关键说明
- TypeORM 0.3+不再支持在
@ManyToOne等关联装饰器中设置primary: true,必须通过@PrimaryColumn显式标记主键列 - 自定义中间表实体后,既可以通过
@OneToMany操作中间表的详细数据,也可以通过@ManyToMany直接操作关联的实体对象
内容的提问来源于stack exchange,提问作者joelC913
相关产品推荐
相关产品推荐

