TypeORM不保存关系

时间:2019-12-13 12:43:44

标签: typeorm

我要保存以下实体:

@Entity('approvals')
export class Approval {
  @PrimaryGeneratedColumn()
  id: string;

  @ManyToOne(type => Task, task => task.approvals, {nullable: false, onDelete: 'CASCADE', lazy: true})
  task: Promise<Task> | Task;

  @ManyToOne(type => User, user => user.approvals, {nullable: false, onDelete: 'CASCADE', lazy: true})
  user: Promise<User> | User;

  @Column({ type: 'enum', enum: ApprovalState, default: ApprovalState.None })
  state: ApprovalState;

  constructor(partialApproval: Partial<Approval>) {
    Object.assign(this, partialApproval);
  }
}

如果我要保存一个看起来像(在调试时复制)的实体:

[
  {
    "task": {
      "id": "2",
      "name": "task1",
      "type": "type1",
      "neededTimeSeconds": 0,
      "factor": 1,
      "userId": "1",
      "periodStart": "2019-01-01",
      "periodEnd": "2019-01-31",
      "done": true,
      "__user__": {
        "id": "1",
        "username": "user1",
        "password": "$2b$10$SBPIVm9p8L4YkpiUVJ.mpedIgWi5Je6MuWTM7IvgMdyhr27JYM0OG",
        "credits": 0,
        "gravatarHash": null
      },
      "__has_user__": true
    },
    "user": {
      "id": "2",
      "username": "shouldHaveApprovalUser1",
      "password": "password1",
      "credits": 0,
      "gravatarHash": null
    }
  },
  {
    "task": {
      "id": "2",
      "name": "task1",
      "type": "type1",
      "neededTimeSeconds": 0,
      "factor": 1,
      "userId": "1",
      "periodStart": "2019-01-01",
      "periodEnd": "2019-01-31",
      "done": true,
      "__user__": {
        "id": "1",
        "username": "user1",
        "password": "$2b$10$SBPIVm9p8L4YkpiUVJ.mpedIgWi5Je6MuWTM7IvgMdyhr27JYM0OG",
        "credits": 0,
        "gravatarHash": null
      },
      "__has_user__": true
    },
    "user": {
      "id": "3",
      "username": "shouldHaveApprovalUser2",
      "password": "password1",
      "credits": 0,
      "gravatarHash": null
    }
  }
]

然后使用上述数组调用repository.save(),我得到:

null value in column "taskId" violates not-null constraint

尽管每个id中都明确定义了task

这是Task实体类:

@Entity('tasks')
export class Task {
  @PrimaryGeneratedColumn({ type: 'bigint' })
  id: string;

  @Column({ length: 30 })
  name: string;

  @Column({ default: 'help' })
  type: string;

  @Column({ name: 'needed_time', type: 'int', nullable: true })
  neededTimeSeconds: number;

  @Column({ type: 'int', default: 1 })
  factor: number;

  @ManyToOne(type => User, { nullable: true, lazy: true })
  @JoinColumn({ name: 'user_id' })
  user: Promise<User>;

  @Column({ name: 'user_id' })
  @RelationId((task: Task) => task.user)
  userId: string;

  @Column({ name: 'period_start', type: 'date', default: new Date() })
  periodStart: string;

  @Column({ name: 'period_end', type: 'date', default: new Date() })
  periodEnd: string;

  @Column({ type: 'boolean', default: false })
  done: boolean;

  @OneToMany(type => Approval, approval => approval.task, { nullable: true, lazy: true })
  approvals: Promise<Approval[]>;

  @OneToMany(type => TaskMessage, taskMessage => taskMessage.task, { cascade: ['remove'], lazy: true })
  messages: Promise<TaskMessage[]>;

  constructor(partialTask: Partial<Task>) {
    Object.assign(this, partialTask);
  }

}

谁能告诉我为什么不分配/保存关系task

1 个答案:

答案 0 :(得分:0)

我认为您缺少关系选项的 cascade: true,这应该设置在关系的松散侧 (OneToMany) - 检查 example

相关问题