TypeOrm 在更新具有多个一对多关系的实体时是否需要使用Transaction

TypeOrm Do I need to useTransaction when updating an entity with multiple one to many relations

我有一家公司 class,其定义如下:

export class Company extends BaseEntity {
  @PrimaryGeneratedColumn()
  @Field((type) => ID) // needed to overwrite the number typ
  id: number;

  @Column()
  name: string;

  @Column()
  domain: string;

  @OneToMany(() => User, (user) => user.company, {
    onDelete: 'SET NULL',
  })
  users: User[];

  @OneToMany(() => Deal, (deal) => deal.company)
  deals: Deal[];
}

并且在更新公司时,更新公司 dto 将同时包含要添加到现有关系的 dealId 和 userId 列表。这是我的更新方法:

async update(id: number, updateCompanyInput: UpdateCompanyInput) {
    console.log(`This action updates a #${id} company`);
    const queryRunner = this.connection.createQueryRunner();
    await queryRunner.connect();

    const company = await queryRunner.manager.preload(Company, {
      id,
      ...updateCompanyInput,
    });
    
    await queryRunner.manager
      .createQueryBuilder()
      .relation(Company, 'users')
      .of(id)
      .add(updateCompanyInput.userIds);

    await queryRunner.manager
      .createQueryBuilder()
      .relation(Company, 'deals')
      .of(id)
      .add(updateCompanyInput.dealIds);

    const result = this.companyRepository.save(company);
    await queryRunner.release();
    return result;
  }

我在想:

  1. 我需要使用交易(https://orkhan.gitbook.io/typeorm/docs/transactions)吗?
  2. 我需要在this.companyRepository.save之后调用queryRunner.release()还是顺序可以更灵活一些?

不需要使用交易。当且仅当您想要在添加 Company, 'deals' 关系出现问题时撤消添加的 Company, 'users' 关系时,您应该使用事务。事务只是在其中进行查询的一种方式原子(即全部发生或none发生)。

至于查询运行程序发布 - 我不确定。我根本没有使用过查询运行器。实际上,我不确定您为什么会这样,所以也许这是一个错误的答案?我对所有内容都使用 getRepository。即要么 getRepository(Company).createQueryBuilder('company')

getRepository(Company).find('primary key value')

假设您在服务器启动时创建连接,两者都应该有效。