I have a setup for my NestJS application in which I am using typeorm with a PostgreSQL database. In the setup, I am using repository mode to query the database. Now I want to use database transactions with my queries, but I am not able to use transactions because I am using one transaction with multiple queries from different repositories, and a transaction uses an entity manager, which has to be used to query the database in order to access the same transaction for all the queries in the scope.
Entity One
@Injectable()
export class EntityOneService extends BaseService<EntityOne> {
repository: Repository<EntityOne>;
constructor(private connection: Connection) {
super();
this.repository = this.connection.getRepository(EntityOne);
}
}
Entity Two
import { Injectable } from '@nestjs/common';
import { Connection, Repository } from 'typeorm';
import { EntityTwo } from '../entities/lesson.entity';
import { BaseService } from './baseService/base-service.service';
@Injectable()
export class EntityTwoService extends BaseService<EntityTwo> {
repository: Repository<EntityTwo>;
constructor(private connection: Connection) {
super();
this.repository = this.connection.getRepository(EntityTwo);
}
}
This is how to initialize the repository from a database table. Now I want to query the database using transaction in repository mode.
const entityOne = await this.entityOneService.find()
const entityTwo = await this.entityTwoService.find()
I want to query both with the same transaction. I have user sequelize
before typeorm, and in sequelize there is a method named transaction
which can used as follows.
this.sequelize.transaction(async transaction => {
const entityOne = await this.entityOneService.findAll({transaction})
const entityTwo = await this.entityTwoService.findAll({transaction})
})
I want to do something like that in typeorm, if possible how can I implement it?
I have found a solution, where I can use the repository and transaction just like sequelize, it is using the manager provided when we start a transaction, there is a method withRepository
inside the manager object, it can be used to do query using a specific repository. So what I have done is created a BaseService and everytime I have to query the database I pass the manager with in the function as last parameter which is optional as well. There I use the manager and do the below.
manager.withRepository(this.repository).<queryFunction>()
Thats it, If you want an example let me know I will implement it and share in a github repository.