如何解决由主键连接的 TypeOrm 一对一关系
我有一个数据库架构,其中包括 3 个表 - 用户、客户和卖家。用户表是客户和卖家的通用表。 我想在 typeorm 上映射 OneToOne 关系,其中客户和卖家的 FK 是自己的主键。所以他们的id应该与对应的User id相同。
相当于 JAVA JPA Hibernate 上的 @MapsId 的东西。
提前致谢..
解决方法
@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从主表(users)复制到另一个表(sellers & clients)的主键/外键
-
在@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"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。