Search code examples
typescripttypeormtypeorm-datamapper

can I use a partial entity to save with typeorm?


So I have this table structure

--changeset 0004-order:ccushing
create table if not exists "order"."order"
(
    id          uuid primary key                                          not null default uuid_generate_v4(),
    state       uuid references "order".order_status
);

--changeset 0004-h0-table-order_event_type:ccushing
create table if not exists "order".order_event_type
(
    id          uuid primary key                                          not null default uuid_generate_v4(),
    key         text unique                                               not null
);

--changeset 0004-h1-table-order_event:ccushing
create table if not exists "order".order_event
(
    id          uuid primary key                                          not null default uuid_generate_v4(),
    order_id    uuid                                                      not null references "order"."order" (id),
    event_type  uuid                                                      not null references "order".order_event_type (id),
    event       jsonb                                                     not null,
    unique (order_id, event),
    unique (order_id, event_type)
);

I want to create a new OrderEventEntity, but I don't want to load Order when doing it, since I'll just be getting the order_id in the event.

@Entity('order.order_event')
export default class OrderEventEntity implements Identifiable<string> {
  @PrimaryGeneratedColumn({ type: 'uuid' })
  readonly id!: string;

  @ManyToOne(() => OrderEventTypeEntity, ({ event }) => event)
  readonly eventType!: string;

  @ManyToOne(() => OrderEntity, ({ events }) => events)
  readonly order!: OrderEntity;
}

am I able to do

const order = new Order({ id: 1234 })
repo.save( new OrderEventEntity({ order: order, ... })

or similar (maybe some partial load) without losing the OneToMany? but still only having the order id.


Solution

  • There are two options:

    1. Define order_id column in your OrderEventEntity
    @Entity('order.order_event')
    export default class OrderEventEntity implements Identifiable<string> {
      @PrimaryGeneratedColumn({ type: 'uuid' })
      readonly id!: string;
    
      @ManyToOne(() => OrderEventTypeEntity, ({ event }) => event)
      readonly eventType!: string;
    
      @Column()
      order_id: string;
    
      @ManyToOne(() => OrderEntity, ({ events }) => events)
      readonly order!: OrderEntity;
    }
    
    1. Use force cast tricky
    const order = { id: 1234 } as Order;
    repo.save( new OrderEventEntity({ order: order, ... })