【问题标题】:TypeORM OneToOne Relation Joined by Primary Key由主键连接的类型ORM OneToOne 关系
【发布时间】:2021-03-20 15:57:47
【问题描述】:

我有一个包含 3 个表的数据库架构 - 用户、客户和卖家。用户表是客户和卖家的公用表。 我想在 TypeORM 上映射 OneToOne 关系,其中客户和卖家的 FK 是自己的主键。所以他们的 id 应该和对应的 User id 相同。

JAVA JPA Hibernate 上的 @MapsId 等价物。

【问题讨论】:

    标签: node.js typeorm one-to-one


    【解决方案1】:

    @Edward 感谢您的贡献..

    我解决了!!

    TypeOrm 在 OneToOne 注释上有一个属性,称为 primary,如果我们将其设置为 true,它将通过主键映射关系,正是我们在 JPA Hibernate 上使用 @MapsId。

    Ex(卖方或客户类别):

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

    它足以在类(例如用户/卖家)之间创建泛化关系,并通过它们的 id 键连接。

    【讨论】:

    • 这里是什么Usuario?是我不清楚的泛化关系吗?你能帮我看看吗
    【解决方案2】:

    TypeOrm 中不存在 JPA Hibernate 上的 @MapsId 之类的东西。 Hibernate 是一个成熟得多的 ORM。

    在 TypeOrm 中你可以达到如下相同的结果:

    1. 在相关表上使用@PrimaryColumn 而不是@PrimaryGeneratedColumn(在您的情况下为卖家和客户)

    2. 在@PrimaryColumn 之后将@OneToOne 关系添加到主表(在您的情况下为用户),并在@JoinColumn 上使列名称与@PrimaryColumn 名称相同。这将为您提供主键和外键关系的单列

    3. 在每个相关表中添加@BeforeInsert,以将主表(用户)的id复制到另一个表(卖家和客户)的主/外键

    4. 在@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"
    

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 2020-10-23
      • 2013-01-04
      • 2015-03-10
      • 1970-01-01
      • 2014-01-21
      相关资源
      最近更新 更多