首页 > 解决方案 > TypeOrm 不会在更新时保存实体及其关系

问题描述

给定以下关系:

@Entity({name: 'accounts'})
export class Account {

  @PrimaryGeneratedColumn('uuid')
  id: string;

  @OneToOne(type => Address, address => address.id)
  @JoinColumn({name: 'address_id'})
  address: Address;

  @Column()
  name: string;
}

和地址关系:

@Entity({name: 'addresses'})
export class Address {

  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({length: 45})
  country: string;
}

当我account通过这个获得实体时:

  /**
   * Gets account by haccount ID with ALL relations
   * @param accountId The account ID
   */
  public async getAccountByAccountIdWithRelations(accountId: string): Promise<Account> {
    return await this.findOneOrFail({id: accountId}, {relations: ['address']});
  }

我得到了包含关系的完整Account实体。Address

然后当我执行以下操作时:

account.address.country = 'newcountry';

并且地址this.save(account)accountRepository的do根本不会更新!

当我在保存之前进行控制台日志时,我看到了account具有更新地址的实体,所以这真的很奇怪!

为什么会这样?

注意:所有查询都在一个事务中完成;我不知道这是否重要

标签: postgresqltypescriptnestjstypeorm

解决方案


应设置级联。这是我的实体的示例:

@Entity()
@Index([ 'studyId', 'teamId', 'enterdate' ])
export class DataMessage extends BaseEntity {
    @PrimaryGeneratedColumn('increment') id: number;

    @CreateDateColumn() enterdate: Date;
    @UpdateDateColumn({ select: false })
    updatedAt?: Date;
    @Column() owner: string;
    @Column() studyId: number;
    @Column() teamId: number;
    @Column() patient: string;
    @Column() orderId: number;
    @Column({ default: DataMessageStatus.OPEN })
    status: DataMessageStatus;

    @Column()
    @Index()
    resultId: number;

    @OneToMany(() => DataMessageContent, (c) => c.message, { cascade: true })
    contents: DataMessageContent[];
}

@Entity()
export class DataMessageContent extends BaseEntity {
    @PrimaryGeneratedColumn('increment') id: number;

    @CreateDateColumn() enterdate: Date;
    @Column() owner: string;
    @Column() role: UserRole;
    @Column({ default: MessageStatus.UNREAD })
    status: MessageStatus;

    @Column() txt: string;

    @ManyToOne(() => DataMessage, (m) => m.contents)
    message: DataMessage;
}

这也应该适用于 onetoone 关系。


推荐阅读