Saltar al contenido principal

Entidades Incrustadas

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Existe una forma asombrosa de reducir la duplicación en tu aplicación (usando composición sobre herencia) mediante embedded columns. Una columna incrustada es una columna que acepta una clase con sus propias columnas y fusiona esas columnas en la tabla de la base de datos de la entidad actual. Ejemplo:

Supongamos que tenemos las entidades User, Employee y Student. Todas estas entidades comparten algunas propiedades comunes: first name y 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
}

Lo que podemos hacer es reducir la duplicación de firstName y lastName creando una nueva clase con esas columnas:

import { Column } from "typeorm"

export class Name {
@Column()
first: string

@Column()
last: string
}

Luego puedes "conectar" estas columnas en tus entidades:

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
}

Todas las columnas definidas en la entidad Name se fusionarán en user, employee y student:

+-------------+--------------+----------------------------+
| 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) | |
+-------------+--------------+----------------------------+

De esta manera, se reduce la duplicación de código en las clases de entidad. Puedes usar tantas columnas (o relaciones) como necesites en las clases incrustadas. Incluso puedes tener columnas incrustadas anidadas dentro de clases incrustadas.