本文以RBAC权限管理中的用户和角色举例,两个实体存在多对多的关系,一个用户拥有多个角色,一个角色属于多个用户。typeorm的中文文档没有对自定义中间表的说明,发现英文有相关说明,但示例代码貌似有问题。

一、中间表有自定义字段的处理

在用户user和role实体之外,新建一个roleUse的实体(记录用户和角色的关联关系),如此本来是多对多的关系,变成了user和role与roleUser二组一对多的关系,这样虽然会多定义一个实体,但好处是可以中间表可以扩展定义其它额外的数据

用户实体 user.entity.ts

import { Entity, Column, Index, ManyToMany, JoinColumn, OneToMany, JoinTable, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn } from 'typeorm';

import { Role } from '../../admin/role/role.entity';

import { UserRole } from '../../admin/role/roleUser.entity';

@Entity()

export class User {

@PrimaryGeneratedColumn()

id: number;

@Column({ length: 100 })

@Index({ unique: true })

name: string;

@OneToMany(type => UserRole, userRole => userRole.user)

userRoles: UserRole[];

}

角色实体role.entity.ts

import { Entity, Column, ManyToMany, OneToMany, JoinTable, JoinColumn } from 'typeorm';

import { BaseEntity } from'../../../common/base/base.entity';

import { UserRole } from './roleUser.entity';

@Entity('role')

export class Role extends BaseEntity {

@Column({ length:100})

role_name: string;

@OneToMany(type=> UserRole, userRole =>userRole.role)

userRoles: UserRole[];

}

中间表实体 roleUser.entity.ts (主健)

import { Entity, PrimaryGeneratedColumn, JoinColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne } from 'typeorm';

import { BaseEntity } from '../../../common/base/base.entity';

import { User } from '../../web/user/user.entity';

import { Role } from './role.entity';

@Entity()

export class UserRole {

@PrimaryGeneratedColumn()

public id: number;

@CreateDateColumn()

created_time: Date;

@UpdateDateColumn()

updated_time: Date;

@ManyToOne(type => User, user => user.userRoles)

@JoinColumn({name: 'user_id'})

user: User;

@ManyToOne(type => Role, role => role.userRoles)

@JoinColumn({name: 'role_id'})

role: Role;

}

中间表定义roleUser.entity.ts(复合主键)

import { Entity, PrimaryGeneratedColumn, JoinColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne } from 'typeorm';

import { BaseEntity } from '../../../common/base/base.entity';

import { User } from '../../web/user/user.entity';

import { Role } from './role.entity';

@Entity()

export class UserRole {

@CreateDateColumn()

created_time: Date;

@UpdateDateColumn()

updated_time: Date;

@ManyToOne(type => User, user => user.userRoles, { primary: true })

@JoinColumn({name: 'user_id'})

user: User;

@ManyToOne(type => Role, role => role.userRoles, { primary: true })

@JoinColumn({name: 'role_id'})

role: Role;

}

二、无中间表的多对多实体定义,又分为单向和双向,单向是仅在一侧与关系装饰器的关系, 双向是与关系两侧的装饰者的关系。具体官网文档:https://typeorm.io/#/relations,此处主要讲双向

角色实体

import { Entity, Column, ManyToMany, OneToMany, JoinTable, JoinColumn } from 'typeorm';

import { BaseEntity } from '../../../common/base/base.entity';

import { User } from '../../web/user/user.entity';

@Entity('role')

export class Role extends BaseEntity {

@Column({ length: 100 })

role_name: string;

@Column({ length: 100 })

remark: string;

// 无中间实体表的配置

@ManyToMany(type => User, user => user.roles, { cascade: true })

users: User[];

}

用户实体

import { Entity, Column, Index, ManyToMany, JoinColumn, OneToMany, JoinTable, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn } from 'typeorm';

import { Role } from '../../admin/role/role.entity';

@Entity()

export class User {

@PrimaryGeneratedColumn()

id: number;

@Column({ length: 100 })

@Index({ unique: true })

name: string;

// 无中间实体表的配置

@ManyToMany(type => Role, role => role.users)

@JoinTable({

name: 'user_role',

joinColumns: [

{name: 'user_id'}

],

inverseJoinColumns: [

{name: 'role_id'}

]

})

// 下面的定义也能实现

// @JoinTable({

// name: 'user_role',

// joinColumn: { name: 'user_id' },

// inverseJoinColumn: { name: 'role_id' },

// })

roles: Role[];

}

typeorm 表名_typeORM 多对多关系不同情况的处理相关推荐

  1. hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例

    hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例 : 操作环境 :Windows 10 教育版.eclipse.MySQL数据库.SQLyog数据库管理工具 MySQL ...

  2. mysql表中的多对多关系表_「一对多」关系型数据库中一对多,多对一,多对多关系(详细) - seo实验室...

    一对多 在关系型数据库中,通过外键将表跟表之间联系在了一起. 一个班级有很多学生,外键维护在学生的一方,也就是多的一方.(在做页面设计的时候,需要把两个表连接到一块查询信息) 建立一个student和 ...

  3. 对于多对多关系的对象,如何建表与关联查询(转载)

    (一)背景介绍   在数据库中建表时,很容易遇到一种情况:一个学生选修了多门课,而每门课有多名学生选修,"学生"和"课程"之间就是典型的多对多关系. (二)如何 ...

  4. flask_sqlalchemy 多对多 关系 对中间表的操作

    文章目录 注意 多对多关系表 创建(同时添加中间表page_tag) 不可以只查询一张表来删除(这种做法只能删除一部分.) 应该查询2张表后删除(只删除 中间表page_tag 中的数据) 添加(只添 ...

  5. ssas对数据仓库_SSAS中的多对多关系简介

    ssas对数据仓库 In this article, I'm going to explain what many-to-many relationships in SSAS are and how ...

  6. 数据库建表-- 一对多/多对一/一对一/多对多 关系

     转自: https://blog.csdn.net/zhongshan_c/article/details/8210196 数据库建表-- 一对多/多对一/一对一/多对多 关系 关联映射:一对多 ...

  7. mybatis框架实现一对多、多对多关系查询,以及递归查询(单表多级分类:省市区三级地址查询)

    mybatis框架练习 mybatis框架中,包括实体类(这些实体类与数据库中的字段属性相对应),mybatis的配置文件(即mybatis-config.xml,这个配置文件用于连接实体类和orm( ...

  8. mybatis-plus多表查询(三表多对多关系)

    数据库表的关系无非就四种:1.一对多(多对一),2.一对一,3.多对多,4.没有关系.其实面对数据表的多对多关系并没有那么复杂,那要看你怎么实现,传统的方法无非就是查询sql语句,而我要的是不通过自己 ...

  9. 6.2 、MyBatis 高级映射(resultMap 标签多表联查 , 一对多,多对一关系)

    文章目录 一.创建表结构,添加数据,实现表中数据的关联关系 二. association 标签:用于一对一.多对一场景使用 1.实现一对一,多对一关系结果集映射 1.1 按照查询嵌套处理 1.2 按照 ...

最新文章

  1. 提高开发效率之VS Code基础配置篇
  2. next_permutation(start,end)
  3. matplotlib 第二次执行报错在 django web服务中
  4. gen文件下有两个R.java_android工程gen目录中R.java包名是怎么确定
  5. php 单一职责原则,Laravel深入学习8 - 单一责任原则
  6. C#中的字符与字符串
  7. 【下载】深入oracle数据库专用虚拟机环境部署方案《VirtualBox+OELR5U7x86_64+Oracle11gR2》...
  8. 移除span的html,从最后一个span元素的伪元素内容中移除::
  9. 推荐|10本不得不看的算法书籍,挖掘数据的灵魂!
  10. 银行从业如何备考,有什么刷题的APP?
  11. 使用swing换一个国际象棋棋盘的实例
  12. java 程序怎么设置中文_怎么让这个简单JAVA程序读写中文字符
  13. 洛谷 P4233 射命丸文的笔记 ntt
  14. 2021牛客寒假算法基础集训营1
  15. 弹性公网IP(EIP)
  16. 114 Three.js实现深度遮挡的下雨特效
  17. Nginx 联合创始人已被释放:「这是典型的敲诈,就这么简单」
  18. BAT有增有减amp;nbsp;互联网2015校园…
  19. 下载文件时,文件名的设置
  20. mysql30天到期了_msyql设置合同到期提醒天数30天

热门文章

  1. jpa 托管_java – jpa非托管实体
  2. pb90代码如何连接sql2008r2_RabbitMQ各种交换机机制,代码实践篇
  3. map平均准确率_第五篇 目标检测评价标准—MAP
  4. 如何用r语言搜集报表_基迪奥免费小课堂——如何用R语言绘制GSEA plot
  5. 微型计算机生产制约因素,精品解析:广东省东莞市2019-2020学年高三下学期第一次统考(5月)模拟考试文科综合地理试题...
  6. python日志模块 限制日志记录数_python日志记录-logging模块
  7. 【tool】关于oracle数据库的安装与使用
  8. 【srcipt】python运行cmd命令
  9. MySQL性能医生:Orzdba工具安装和使用
  10. linux进程创建过程,Linux 进程创建过程的分析