node.js - 保存和更新不会删除已删除的实体

标签 node.js database typescript nestjs typeorm

问题描述

检索父实体“User”时,我可以添加和更新一对多相关实体“AdminUserGroup”。但是,当子实体“AdminUserGroup”从父“User”中删除时,什么也没有发生。

子对象中的外键没有设置为空,也没有删除记录。

我使用 postgres 作为数据库。

重现步骤

子实体移除方法

async updateUserAdmin(data: UpdateUserAdminDto): Promise<User> {
    var user = await this.findById(data.userId);
  
    user.userGroups = null
    //i have also tried
    //user.userGroups = []

    return await this.userRepository.save(user);
  }

父实体

@Entity({name: 'users'})
class User implements IUser {
  @PrimaryGeneratedColumn()
    id: number

  @Column()
    companyId: number

  @Column()
    privilegeId: number

  @OneToMany(
    () => AdminUserGroup, 
    (userGroup) => userGroup.user, { cascade: true })
    userGroups: AdminUserGroup[]
}

子实体

@Entity({ name: 'admin_cost_centers' })
class AdminUserGroup {
  @PrimaryGeneratedColumn()
    id: number

  @ManyToOne(() => User, (user) => user.userGroups, orphanedRowAction: 'delete')
  @JoinColumn()
    user: User

  @ManyToOne(() => Group, (group) => group.userGroups, orphanedRowAction: 'delete')
  @JoinColumn()
    group: Group

  @Column()
    startedAt: Date
}

最佳答案

如果父级被删除,级联操作onDelete: CASCADE会导致子级被删除。由于您不是删除父实体本身,而是使相应子实体中的引用无效,因此级联不适用。

自0.2.33版本起,typeorm支持orphanedRowAction在子实体上,它允许您指定如果引用即将被删除应该发生什么:

@Entity({ name: 'admin_cost_centers' })
class AdminUserGroup {
  @PrimaryGeneratedColumn()
    id: number

  @ManyToOne(() => User, (user) => user.userGroups, {
    // The 'delete' action causes the user group to be deleted
    // if it is no longer mapped to a user
    orphanedRowAction: 'delete'
  })
  @JoinColumn()
    user: User

  @Column()
    startedAt: Date
}

关于node.js - 保存和更新不会删除已删除的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69905731/

相关文章:

linux - 如何将 Node js服务器作为守护进程运行?

c++ - 在 Node.js 插件的 void * 中检索和存储 V8 对象

database - MS Access 数据库错误

typescript - typeorm 和 nestjs 中的通用类型

javascript - NextJS 服务器文件中的 typescript 错误

javascript - 如何从数组中获取匹配元素并更改数组对象?

javascript - 显示上一分钟可变数字的函数

node.js - 单页应用程序,http 或 websockets,connect/express 是干什么用的?

java - 从 hibernate 列表中选择所有项目

java - Atomikos、Java 8 和多个数据库