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。
