跳转到主要内容

嵌入实体

使用嵌入列(embedded columns)可以以一种令人惊叹的方式减少应用程序中的重复(使用组合而不是继承)。 嵌入列是接受一个包含其自身列的类的列,并将这些列合并到当前实体的数据库表中。 示例:

假设我们有 UserEmployeeStudent 实体。 所有这些实体都有一些共同之处 - firstNamelastName 属性。

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: string

@Column()
firstName: string

@Column()
lastName: string

@Column()
isActive: boolean
}
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"

@Entity()
export class Employee {
@PrimaryGeneratedColumn()
id: string

@Column()
firstName: string

@Column()
lastName: string

@Column()
salary: string
}
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"

@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: string

@Column()
firstName: string

@Column()
lastName: string

@Column()
faculty: string
}

我们可以通过创建一个带有这些列的新类来减少 firstNamelastName 的重复:

import { Column } from "typeorm"

export class Name {
@Column()
first: string

@Column()
last: string
}

然后,您可以在实体中 "连接" 这些列:

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
import { Name } from "./Name"

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: string

@Column(() => Name)
name: Name

@Column()
isActive: boolean
}
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
import { Name } from "./Name"

@Entity()
export class Employee {
@PrimaryGeneratedColumn()
id: string

@Column(() => Name)
name: Name

@Column()
salary: number
}
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
import { Name } from "./Name"

@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: string

@Column(() => Name)
name: Name

@Column()
faculty: string
}

useremployeestudent 实体中,所有在 Name 实体中定义的列将被合并:

+-------------+--------------+----------------------------+
| user |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| nameFirst | varchar(255) | |
| nameLast | varchar(255) | |
| isActive | boolean | |
+-------------+--------------+----------------------------+

+-------------+--------------+----------------------------+
| employee |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| nameFirst | varchar(255) | |
|nameLast | varchar(255) | |
| salary | int(11) | |
+-------------+--------------+----------------------------+

+-------------+--------------+----------------------------+
| student |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| nameFirst | varchar(255) | |
| nameLast | varchar(255) | |
| faculty | varchar(255) | |
+-------------+--------------+----------------------------+

这样可以减少实体类中的代码重复。
您可以在嵌入类中使用任意数量的列(或关联)。
甚至可以在嵌入类中嵌套其他嵌入列。