【问题标题】:Value of column in one to one relation using TypeORM + Postgres is null使用 TypeORM + Postgres 的一对一关系中的列值为 null
【发布时间】:2021-07-31 22:15:10
【问题描述】:

我正在尝试在 itemitem_name 之间建立简单的一对一关系。实体如下所示:

@Entity('item')
export class ItemEntity {
  @PrimaryColumn('integer')
  id: number;

  @OneToOne(() => ItemNameEntity)
  @JoinColumn()
  name: ItemNameEntity;

  // ... other props
}

item-name.entity

@Entity('item_name')
export class ItemNameEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  en: string;

  @Column()
  fr: string;

  // ... other properties
}

我使用以下有效负载插入item

{
      id: 26,
      name: { en: 'English name', fr: 'French name' },
}

它按预期存储项目,并添加一个nameId 列。问题是它没有向item_name 插入任何内容,因此nameId 列是null

我在这里错过了什么?

【问题讨论】:

    标签: postgresql nestjs typeorm


    【解决方案1】:

    来自this

    您必须在ItemEntity 中的name 关系上设置cascade: true

    @Entity('item')
    export class ItemEntity {
      @PrimaryColumn('integer')
      id: number;
    
      @OneToOne(() => ItemNameEntity, { cascade: true })
      @JoinColumn()
      name: ItemNameEntity;
    
      // ... other props
    }
    

    ItemEntity 上设置cascade: true 告诉TypeORM,如果一个新的itemName “链接” 在一个item 并且 item 被保存,新的 itemName 也应该被保存到数据库中。

    例子:

    const manager = getManager();
    const item: ItemEntity = manager.create(ItemEntity, {
      id: 26,
      name: manager.create(ItemNameEntity, {
        en: 'English name',
        fr: 'French name'
      }),
    });
    await manager.save(ItemEntity, item);
    

    【讨论】:

    • 这为我指明了我想要进入的方向。我在保存父项(项目)之前插入了 item_name 实体,它可以工作。 itemId 列填充了正确的 id。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多