当新用户注册时,我想创建一些关系以自动进行设置。目前,我正在以这种方式进行操作:
const user = await User.create({
email,
password: hashedPassword,
}).save();
const settings = await Settings.create({
userId: user.id,
}).save();
const settings = await Profile.create({
userId: user.id,
}).save();
据我了解,事务是处理相关操作的最佳方法,但是PG直到保存用户ID才创建用户ID。
这是我能提出的最好的交易:
const user = await User.create({
email,
password: hashedPassword,
}).save();
const settings = await Settings.create({
userId: user.id,
});
const profile = await Profile.create({
userId: user.id,
});
await getConnection().transaction(async (transactionalEntityManager) => {
await transactionalEntityManager.save(settings);
await transactionalEntityManager.save(profile);
});
但是,仍然存在用户保存的可能性,但是关系没有保存。
有没有更好(或更简单的方法)来解决这个问题?
用户实体
@Entity()
export class User {
@PrimaryGeneratedColumn()
id!: number;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
@Column({ unique: true })
email!: string;
@Column()
password!: string;
@OneToOne(() => Settings, (settings) => settings.user)
settings: Settings;
@OneToOne(() => Profile, (profile) => profile.user)
profile: Profile;
}
settings.entity.ts
@Entity()
export class Settings {
@PrimaryColumn()
userId: number;
@OneToOne(() => User, (user) => user.settings)
user: User;
}
个人资料
@Entity()
export class Profile {
@PrimaryColumn()
userId: number;
@OneToOne(() => User, (user) => user.profile)
user: User;
}
该save
关系的方法之前加载INSERT
,因此它是无法进行save
的settings
,生成的查询将首先尝试SELECT
的user
,然后才INSERT
settings
像你说的-一个事务中,不可能选择未提交的记录,那为什么它不”工作。
该怎么办?两种选择:
const user = await getConnection()
.transaction((transactionalEntityManager) => {
const userObj = User.create({
email,
password: hashedPassword,
})
userObj.profile = Profile.create({});
userObj.settings = Settings.create({});
return transactionalEntityManager.save(User, userObj);
});
settings
和profile
const userInsertResult = await getConnection()
.transaction(async (transactionalEntityManager) => {
const userInsertResult = await transactionalEntityManager
.createQueryBuilder(User,'user')
.insert()
.into(User)
.values({
email,
password: hashedPassword
}).execute();
const settingsInsertResult = await transactionalEntityManager
.createQueryBuilder(Settings,'settings')
.insert()
.into(Settings)
.values({
userId: userInsertResult.raw.id
}).execute();
const profileInsertResult = await transactionalEntityManager
.createQueryBuilder(Profile,'profile')
.insert()
.into(Profile)
.values({
userId: userInsertResult.raw.id
}).execute();
return userInsertResult
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句