Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

232
Views
TipoORM Relación uno a uno unida por clave principal

Tengo un esquema de base de datos que incluye 3 tablas: usuarios, clientes y vendedores. La tabla de usuarios es una tabla común para Clientes y Vendedores. Me gustaría mapear una relación OneToOne en TypeORM donde el FK de Clientes y Vendedores es la clave principal propia. Por lo tanto, sus identificaciones deben ser las mismas identificaciones de la identificación de usuario correspondiente.

Algo equivalente a @MapsId en JAVA JPA Hibernate.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

@Edward gracias por tu contribución..

¡¡Resolví eso!!

TypeOrm tiene una propiedad en la anotación OneToOne, llamada principal, y si la establecemos en verdadero, mapeará la relación a través de la clave principal, exactamente como usamos @MapsId en JPA Hibernate.

Ej. (En la clase Vendedor o Clientes):

 @OneToOne(() => Usuario, { primary: true, cascade: true }) @JoinColumn({ name: 'OPD_id' }) usuario: Usuario;

Es suficiente para crear una relación de generalización entre clases (por ejemplo, Usuario/Vendedor), unidas por sus claves de identificación.

over 4 years ago · Santiago Trujillo Report

0

Algo como @MapsId en JPA Hibernate no existe en TypeOrm. Hibernate es un ORM mucho más maduro.

En TypeOrm puede lograr el mismo resultado de la siguiente manera:

  1. Use @PrimaryColumn en lugar de @PrimaryGeneratedColumn en las tablas relacionadas (vendedores y clientes en su caso)

  2. Después de @PrimaryColumn, agregue la relación @OneToOne a la tabla principal (usuarios en su caso), y en @JoinColumn haga que el nombre de la columna sea el mismo que el nombre de @PrimaryColumn. Esto le dará una sola columna para la clave principal y la relación de clave externa

  3. Agregue @BeforeInsert en cada una de las tablas relacionadas para copiar la identificación de la tabla principal (usuarios) a la clave principal/foránea de la otra tabla (vendedores y clientes)

  4. Use { "cascade": true } en @OneToOne, por lo que solo necesita guardar la tabla relacionada, la tabla principal se guardará automáticamente primero dentro de la misma transacción, luego @BeforeInsert copiará la nueva clave a la tabla relacionada, luego la tabla relacionada se guardará

 import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn, PrimaryColumn, BeforeInsert } from "typeorm"; @Entity() export class users { @PrimaryGeneratedColumn() id: number; @Column() username: string; } @Entity() export class clients { @PrimaryColumn() clientid: number; @OneToOne(() => users, { "cascade": true }) @JoinColumn({ name: "clientid" } ) // This matches @PrimaryColumn name user: users; @BeforeInsert() newid() { this.clientid = this.user.id; } @Column() clientname: string; } @Entity() export class sellers { @PrimaryColumn() sellerid: number; @OneToOne(() => users, { "cascade": true }) @JoinColumn({ name: "sellerid" } ) // This matches @PrimaryColumn name user: users; @BeforeInsert() newid() { this.sellerid = this.user.id; } @Column() sellername: string; }

Código principal, para guardar Usuario + Vendedor:

 const connection = await createConnection(); const entityManager = connection.createEntityManager(); const user = new users(); const seller = new sellers(); seller.user = user; user.username = "Giordano User"; seller.sellername = 'Giordano Seller'; await entityManager.save(seller); // "user" saves automatically because of "cascade"
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!