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;
}
我在想:
- 我需要使用交易(https://orkhan.gitbook.io/typeorm/docs/transactions)吗?
- 我需要在
this.companyRepository.save
之后调用queryRunner.release()
还是顺序可以更灵活一些?
您不需要使用交易。当且仅当您想要在添加 Company, 'deals'
关系出现问题时撤消添加的 Company, 'users'
关系时,您应该使用事务。事务只是在其中进行查询的一种方式原子(即全部发生或none发生)。
至于查询运行程序发布 - 我不确定。我根本没有使用过查询运行器。实际上,我不确定您为什么会这样,所以也许这是一个错误的答案?我对所有内容都使用 getRepository
。即要么
getRepository(Company).createQueryBuilder('company')
或
getRepository(Company).find('primary key value')
假设您在服务器启动时创建连接,两者都应该有效。
我有一家公司 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;
}
我在想:
- 我需要使用交易(https://orkhan.gitbook.io/typeorm/docs/transactions)吗?
- 我需要在
this.companyRepository.save
之后调用queryRunner.release()
还是顺序可以更灵活一些?
您不需要使用交易。当且仅当您想要在添加 Company, 'deals'
关系出现问题时撤消添加的 Company, 'users'
关系时,您应该使用事务。事务只是在其中进行查询的一种方式原子(即全部发生或none发生)。
至于查询运行程序发布 - 我不确定。我根本没有使用过查询运行器。实际上,我不确定您为什么会这样,所以也许这是一个错误的答案?我对所有内容都使用 getRepository
。即要么
getRepository(Company).createQueryBuilder('company')
或
getRepository(Company).find('primary key value')
假设您在服务器启动时创建连接,两者都应该有效。