【问题标题】:Queries in AfterUpdate are not working as expected in TypeORMAfterUpdate 中的查询在 TypeORM 中没有按预期工作
【发布时间】:2020-11-03 07:51:02
【问题描述】:

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

MyEntity
  children (OneToMany)

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

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

我还有一个订阅者正在监听更新后事件,该事件也按预期触发。但是,更新不会删除该条目。该条目现在是孤立的,具有空关系 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 的行为就像 DELETE 在 UPDATE 之前运行一样。

你能帮我理解我做错了什么吗?

【问题讨论】:

    标签: postgresql typeorm typeorm-datamapper


    【解决方案1】:

    我通过提交当前事务(因此数据保存到数据库)并开始一个新事务来解决它,所以 TypeORM 稍后会提交这个新事务。我返回了我的查询执行(一个 Promise)以确保 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      相关资源
      最近更新 更多