网站搜索

javascript - 为什么我没有实体的引用 ID?


我在 TypeORM 中有两个简单的实体,彼此之间有 一对一 关系。如果我发出 POST 请求,我可以得到表格,但引用的 ID 仍然是 null。这是为什么?

主要用户实体:

@Entity({ name: "user" })
export class User extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ unique: true })
  username: string;

  @Column()
  password: string;

  @OneToOne(
    (type) => Personal,
    (personal) => personal.user,
    { cascade: true }
  )
  @JoinColumn()
  personalId: personal;
}

个人实体:

@Entity({ name: "personal" })
export class Personal {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ nullable: true })
  familyName: string;

  @Column({ nullable: true })
  additionalName: string;

  @OneToOne(
    (type) => User,
    (user) => user.personalId
  )
  user: User;
}

更新:

我尝试设置了eager: true,但没有任何变化。我曾尝试设置nullable: false并删除了现有的数据库,但当我尝试 POST 时,什么也没发生。

答案#1

你在 OneToOne 装饰器中指定了 cascade: true,这意味着当你保存一个包含某个人的用户时,这个人也会被保存。当你加载用户时,你需要指定需要关联加载 person 的数据。否则 person 实体会被持久化,但在获取用户时不会被加载。在你的情况下,可以通过将 eager 设置为 true 来实现:

  @OneToOne(
    (type) => Personal,
    (personal) => personal.user,
    { cascade: true, eager: true }
  )
  @JoinColumn()
  personalId: personal;

如果你想使用查询构建器,这将有效:

const queryBuilder = entityManager.createQueryBuilder(User, 'user');
queryBuilder.leftJoinAndSelect('user.person', 'person');
return queryBuilder.getMany();

答案#2

如果你想加载 ID,或者单独处理 ID(例如,在不加载目标实体的情况下设置关系),只需按以下方式声明关系 ID 列:

  @OneToOne(
    (type) => Personal,
    (personal) => personal.user,
    { cascade: true, eager: true }
  )
  personal!: Personal;

  @Column('int')
  personalId!: personal;

如果你需要它可以为空,只需使用 @Column('int', { nullable: true })。

TypeORM 会识别该列,因为它具有相同的名称,并且不会重复架构命令,同时您可以直接使用关联 ID。