diff --git a/backend/src/data/dwengo-entity-repository.ts b/backend/src/data/dwengo-entity-repository.ts index f17b6976..3fe23711 100644 --- a/backend/src/data/dwengo-entity-repository.ts +++ b/backend/src/data/dwengo-entity-repository.ts @@ -1,12 +1,25 @@ -import { EntityRepository, FilterQuery } from '@mikro-orm/core'; +import { EntityRepository, FilterQuery, SyntaxErrorException } from '@mikro-orm/core'; import { EntityAlreadyExistsException } from '../exceptions/entity-already-exists-exception.js'; +import { getLogger } from '../logging/initalize.js'; export abstract class DwengoEntityRepository extends EntityRepository { public async save(entity: T, options?: { preventOverwrite?: boolean }): Promise { if (options?.preventOverwrite && (await this.findOne(entity))) { throw new EntityAlreadyExistsException(`A ${this.getEntityName()} with this identifier already exists.`); } - await this.getEntityManager().persistAndFlush(entity); + try { + await this.getEntityManager().persistAndFlush(entity); + } catch (e: unknown) { + // Workaround for MikroORM bug: Sometimes, queries are generated with random syntax errors. + // The faulty query is then retried everytime something is persisted. By clearing the entity + // Manager in that case, we make sure that future queries will work. + if (e instanceof SyntaxErrorException) { + getLogger().error("SyntaxErrorException caught => entity manager cleared."); + this.em.clear(); + } else { + throw e; + } + } } public async deleteWhere(query: FilterQuery): Promise { const toDelete = await this.findOne(query);