typeorm 表名_typeORM 多对多关系不同情况的处理
本文以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 多对多关系不同情况的处理相关推荐
- hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例
hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例 : 操作环境 :Windows 10 教育版.eclipse.MySQL数据库.SQLyog数据库管理工具 MySQL ...
- mysql表中的多对多关系表_「一对多」关系型数据库中一对多,多对一,多对多关系(详细) - seo实验室...
一对多 在关系型数据库中,通过外键将表跟表之间联系在了一起. 一个班级有很多学生,外键维护在学生的一方,也就是多的一方.(在做页面设计的时候,需要把两个表连接到一块查询信息) 建立一个student和 ...
- 对于多对多关系的对象,如何建表与关联查询(转载)
(一)背景介绍 在数据库中建表时,很容易遇到一种情况:一个学生选修了多门课,而每门课有多名学生选修,"学生"和"课程"之间就是典型的多对多关系. (二)如何 ...
- flask_sqlalchemy 多对多 关系 对中间表的操作
文章目录 注意 多对多关系表 创建(同时添加中间表page_tag) 不可以只查询一张表来删除(这种做法只能删除一部分.) 应该查询2张表后删除(只删除 中间表page_tag 中的数据) 添加(只添 ...
- ssas对数据仓库_SSAS中的多对多关系简介
ssas对数据仓库 In this article, I'm going to explain what many-to-many relationships in SSAS are and how ...
- 数据库建表-- 一对多/多对一/一对一/多对多 关系
转自: https://blog.csdn.net/zhongshan_c/article/details/8210196 数据库建表-- 一对多/多对一/一对一/多对多 关系 关联映射:一对多 ...
- mybatis框架实现一对多、多对多关系查询,以及递归查询(单表多级分类:省市区三级地址查询)
mybatis框架练习 mybatis框架中,包括实体类(这些实体类与数据库中的字段属性相对应),mybatis的配置文件(即mybatis-config.xml,这个配置文件用于连接实体类和orm( ...
- mybatis-plus多表查询(三表多对多关系)
数据库表的关系无非就四种:1.一对多(多对一),2.一对一,3.多对多,4.没有关系.其实面对数据表的多对多关系并没有那么复杂,那要看你怎么实现,传统的方法无非就是查询sql语句,而我要的是不通过自己 ...
- 6.2 、MyBatis 高级映射(resultMap 标签多表联查 , 一对多,多对一关系)
文章目录 一.创建表结构,添加数据,实现表中数据的关联关系 二. association 标签:用于一对一.多对一场景使用 1.实现一对一,多对一关系结果集映射 1.1 按照查询嵌套处理 1.2 按照 ...
最新文章
- 提高开发效率之VS Code基础配置篇
- next_permutation(start,end)
- matplotlib 第二次执行报错在 django web服务中
- gen文件下有两个R.java_android工程gen目录中R.java包名是怎么确定
- php 单一职责原则,Laravel深入学习8 - 单一责任原则
- C#中的字符与字符串
- 【下载】深入oracle数据库专用虚拟机环境部署方案《VirtualBox+OELR5U7x86_64+Oracle11gR2》...
- 移除span的html,从最后一个span元素的伪元素内容中移除::
- 推荐|10本不得不看的算法书籍,挖掘数据的灵魂!
- 银行从业如何备考,有什么刷题的APP?
- 使用swing换一个国际象棋棋盘的实例
- java 程序怎么设置中文_怎么让这个简单JAVA程序读写中文字符
- 洛谷 P4233 射命丸文的笔记 ntt
- 2021牛客寒假算法基础集训营1
- 弹性公网IP(EIP)
- 114 Three.js实现深度遮挡的下雨特效
- Nginx 联合创始人已被释放:「这是典型的敲诈,就这么简单」
- BAT有增有减amp;nbsp;互联网2015校园…
- 下载文件时,文件名的设置
- mysql30天到期了_msyql设置合同到期提醒天数30天
热门文章
- jpa 托管_java – jpa非托管实体
- pb90代码如何连接sql2008r2_RabbitMQ各种交换机机制,代码实践篇
- map平均准确率_第五篇 目标检测评价标准—MAP
- 如何用r语言搜集报表_基迪奥免费小课堂——如何用R语言绘制GSEA plot
- 微型计算机生产制约因素,精品解析:广东省东莞市2019-2020学年高三下学期第一次统考(5月)模拟考试文科综合地理试题...
- python日志模块 限制日志记录数_python日志记录-logging模块
- 【tool】关于oracle数据库的安装与使用
- 【srcipt】python运行cmd命令
- MySQL性能医生:Orzdba工具安装和使用
- linux进程创建过程,Linux 进程创建过程的分析