首页 > 解决方案 > 为什么我没有实体的参考 ID?

问题描述

我在 TypeORM 中有两个带有One To One连接的简单实体。如果我提出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 时,什么也没发生。

标签: javascriptnode.jstypescriptormtypeorm

解决方案


cascade: true在 OneToOne 装饰器中指定,这意味着当您使用给定人员保存用户时,该人也将被保存。加载用户时,需要指定人员的数据需要加入。否则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();

推荐阅读