Tim VN
Tim VN

Reputation: 1193

Value of column in one to one relation using TypeORM + Postgres is null

I'm trying to set up a simple one-to-one relation between an item and item_name. The entity looks as follows:

@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
}

I insert an item using the following payload:

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

It stores the item as expected, and adds a nameId column. The problem is that it does not insert anything into item_name, and thus the nameId column is null.

What am I missing here?

Upvotes: 1

Views: 3140

Answers (1)

Carlo Corradini
Carlo Corradini

Reputation: 3425

From this.

You have to set cascade: true on name relation in ItemEntity:

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

  @OneToOne(() => ItemNameEntity, { cascade: true })
  @JoinColumn()
  name: ItemNameEntity;

  // ... other props
}

Setting cascade: true on ItemEntity tells TypeORM that if a new itemName is "linked" on an item and the item is saved, the new itemName should also be saved to the database.

Example:

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);

Upvotes: 1

Related Questions