You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:10:29