AfterUpdate中的查询在TypeORM中未按预期工作 [英] Queries in AfterUpdate are not working as expected in TypeORM

查看:0
本文介绍了AfterUpdate中的查询在TypeORM中未按预期工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在TypeORM中有一个实体,其中包含其他子实体的数组:

MyEntity
  children (OneToMany)

当我删除一个子实体(例如,ID=2)并保存此实体时,框架会在子实体表中按预期触发更新:

UPDATE "my_children_table" SET "myEntityId" = null WHERE "id" = 2 

我还有一个订阅者在监听After UPDATE事件,该事件也按预期被触发。但是,更新不会删除该条目。该条目现在是使用空关系ID孤立的。在下面的示例中,我使用订阅服务器清理孤立的实体:

@EventSubscriber()
export class MyChildSubscriber implements EntitySubscriberInterface<MyChildEntity> {
  public listenTo(): string | Function {
    return MyChildEntity;
  }

  public async afterUpdate(event: LoadEvent<MyChildEntity>) {
    console.log('It works! The event is triggered as expected!');

    const builder = event.connection
      .createQueryBuilder()
      .delete()
      .from(MyChildEntity)
      .where('"myEntityId" IS NULL');

    return builder.execute();
  }
}
但是,当上面的查询运行时,更新尚未运行,因此不会从数据库中删除任何内容。我原以为删除操作会删除孤立行。

根据TypeORM日志,查询按以下顺序执行:

START TRANSACTION
UPDATE "my_children_table" SET "myEntityId" = $2 WHERE "id" = $1 -- PARAMETERS: [2,null]
DELETE FROM "my_children_table" WHERE "myEntityId" IS NULL
COMMIT

如果我直接在我的数据库中运行相同的事务(我使用的是PostgreSQL),则一切都按预期工作,但TypeORM的行为与更新之前运行的删除操作相同。

您能帮我弄清楚我做错了什么吗?

推荐答案

我通过提交当前事务(以便将数据保存到数据库)并启动新事务来解决此问题,因此TypeORM将在稍后提交此新事务。我返回了我的查询执行(承诺)以确保TypeORM将等待它:

public async afterUpdate(event: LoadEvent<MyChildEntity>) {
  await event.queryRunner.commitTransaction();
  await event.queryRunner.startTransaction();
  return event.manager
    .createQueryBuilder()
    .delete()
    .from(MyChildEntity)
    .where('"myEntityId" IS NULL')
    .execute();
}

这篇关于AfterUpdate中的查询在TypeORM中未按预期工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆