如何在Typeorm中建立OneToMany关系?

时间:2020-01-24 20:02:07

标签: mysql typescript typeorm

我有一个用户实体,该实体具有一个userRoles数组作为数据成员。用户存储在数据库中的名为users的表中,而user_roles存储在名为user_role_mapping的表中。我想与typeorm建立一对多关系,以便在将用户保存到数据库中时还将其相应的userRoles保存在各自的表中。我无法使其正常工作。

这是我的用户实体

@Entity("users",{schema:"Cellphones" } )
@Index("net_id",["netId",],{unique:true})
export class User {

    @PrimaryGeneratedColumn({
        type:"int", 
        name:"id"
        })
    id: number;


    @Column("varchar",{ 
        nullable:false,
        unique: true,
        length:20,
        name:"net_id"
        })
    netId: string;


    @Column("varchar",{ 
        nullable:true,
        length:20,
        name:"employee_id"
        })
    employeeId: string | null;


    @Column("varchar",{ 
        nullable:false,
        length:50,
        name:"first_name"
        })
    firstName: string;


    @Column("varchar",{ 
        nullable:false,
        length:50,
        name:"last_name"
        })
    lastName: string;


    @Column("varchar",{ 
        nullable:true,
        length:50,
        name:"title"
        })
    title: string | null;


    @Column("tinyint",{ 
        nullable:false,
        width:1,
        name:"active"
        })
    active: boolean;


    @Column("varchar",{ 
        nullable:true,
        length:100,
        name:"email"
        })
    email: string | null;


    @Column("varchar",{ 
        nullable:true,
        length:20,
        name:"phone"
        })
    phone: string | null;


    @Column("date",{ 
        nullable:true,
        name:"term_date"
        })
    termDate: Date | null;


    @Column("varchar",{ 
        nullable:true,
        length:10,
        name:"term_department"
        })
    termDepartment:string | null;


    @Column("date",{ 
        nullable:true,
        name:"retire_date"
        })
    retireDate: Date | null;


    @Column("date",{ 
        nullable:false,
        name:"last_login"
        })
    lastLogin: Date;


    @Column("varchar",{ 
        nullable:false,
        length:50,
        name:"employee_status"
        })
    employeeStatus:string;


    @Column("varchar",{ 
        nullable:false,
        length:50,
        name:"department"
        })
    department:string;


    @Column("varchar",{ 
        nullable:true,
        length:10,
        name:"pay_group"
        })
    payGroup:string | null;


    @Column("datetime",{ 
        nullable:true,
        name:"updated"
        })
    updated:Date | null;


    @Column("int",{ 
        nullable:true,
        name:"updated_by"
        })
    updatedBy:number | null;


    @Column("date",{ 
        nullable:true,
        name:"inactivated"
        })
    inactivated:Date | null;


    @Column("int",{ 
        nullable:true,
        name:"inactivated_by"
        })
    inactivatedBy:number | null;

    @OneToMany(type => UserRoleMapping, userRoleMapping => userRoleMapping.userId)
    userRoles: UserRoleMapping[];
}

这是我的UserRoleMapping实体:

@ManyToOne(type => User, user => user.userRoles)
@Entity("user_role_mapping",{schema:"Cellphones" } )
export class UserRoleMapping {

    constructor(id: number, userId: number, roleId: number) {}

    @PrimaryGeneratedColumn({
        type:"int",
        name:"id"
        })
    id: number;


    @Column({
        type:"int",
        name:"user_id"
        })
    userId: number;

    @Column({
        type:"int",
        name:"role_id"
        })
    roleId: number;
}

这是users表的样子:

enter image description here

这是user_role_mapping表的外观:

enter image description here

请注意,任何名称以old_开头的列仅用于数据迁移,与该项目无关。

2 个答案:

答案 0 :(得分:0)

实体UserRoleMapping的定义中存在一些错误:

  • relation decorater必须应用于不在类级别的实体属性(数据库列)。
  • 关系装饰器的inverse属性不应以另一个表的主键为目标,而应将导航属性(稍后将保留映射的实体对象而不是外键)作为目标。
  • 如果使用mysql数据库(而不是提示),则将忽略schema的{​​{1}}选项。

如果您对与实体属性名称不同的列和表更喜欢使用custom naming strategy,则可以在TypeORM配置中全局定义它。对于较小的调整,您可以从DefaultNamingStrategy中得出。

答案 1 :(得分:0)

这是使关系正常工作的代码。

在用户中:

@OneToMany(type => UserRoleMapping, userRoleMapping => userRoleMapping.user, 
    { eager: true, cascade: true})
userRoles: UserRoleMapping[];

在UserRoleMapping中:

@ManyToOne(type => User, user => user.userRoles)
@JoinColumn({ name: "user_id", referencedColumnName: "id"})
user: User;

关键是将关系修饰符移动到用户字段并定义@JoinColumn。