【发布时间】:2021-03-20 15:57:47
【问题描述】:
我有一个包含 3 个表的数据库架构 - 用户、客户和卖家。用户表是客户和卖家的公用表。 我想在 TypeORM 上映射 OneToOne 关系,其中客户和卖家的 FK 是自己的主键。所以他们的 id 应该和对应的 User id 相同。
JAVA JPA Hibernate 上的 @MapsId 等价物。
【问题讨论】:
标签: node.js typeorm one-to-one
我有一个包含 3 个表的数据库架构 - 用户、客户和卖家。用户表是客户和卖家的公用表。 我想在 TypeORM 上映射 OneToOne 关系,其中客户和卖家的 FK 是自己的主键。所以他们的 id 应该和对应的 User id 相同。
JAVA JPA Hibernate 上的 @MapsId 等价物。
【问题讨论】:
标签: node.js typeorm one-to-one
@Edward 感谢您的贡献..
我解决了!!
TypeOrm 在 OneToOne 注释上有一个属性,称为 primary,如果我们将其设置为 true,它将通过主键映射关系,正是我们在 JPA Hibernate 上使用 @MapsId。
Ex(卖方或客户类别):
@OneToOne(() => Usuario, { primary: true, cascade: true })
@JoinColumn({ name: 'OPD_id' })
usuario: Usuario;
它足以在类(例如用户/卖家)之间创建泛化关系,并通过它们的 id 键连接。
【讨论】:
TypeOrm 中不存在 JPA Hibernate 上的 @MapsId 之类的东西。 Hibernate 是一个成熟得多的 ORM。
在 TypeOrm 中你可以达到如下相同的结果:
在相关表上使用@PrimaryColumn 而不是@PrimaryGeneratedColumn(在您的情况下为卖家和客户)
在@PrimaryColumn 之后将@OneToOne 关系添加到主表(在您的情况下为用户),并在@JoinColumn 上使列名称与@PrimaryColumn 名称相同。这将为您提供主键和外键关系的单列
在每个相关表中添加@BeforeInsert,以将主表(用户)的id复制到另一个表(卖家和客户)的主/外键
在@OneToOne上使用{ "cascade": true },所以你只需要保存相关表,在同一个事务中会先自动保存主表,然后@BeforeInsert会复制新的key到相关表表,则相关表将被保存
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;
}
主代码,保存用户+卖家:
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"
【讨论】: