跳至主内容区

内嵌实体

非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

有一种绝妙的方法可以减少应用中的重复代码(通过组合而非继承),那就是使用 embedded columns(内嵌列)。 内嵌列是一种可以接收包含自有列的类,并将这些列合并到当前实体的数据库表中的列。 示例:

假设我们有 UserEmployeeStudent 实体。 所有这些实体都有一些共同属性——first name(名字)和 last name(姓氏)

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
}

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

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

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

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

通过这种方式,实体类中的代码重复得以减少。 你可以在内嵌类中使用任意数量的列(或关系)。 甚至可以在内嵌类中嵌套使用内嵌列。