Nest+TypeORM关联实体保存问题:Lyric的UserId未自动填充
问题分析与解决方案
实体配置错误点
- 关联类名错误:Lyric实体中
@ManyToOne(type => User)引用的User是不存在的类,你的用户实体类是Usuario,需修正为正确的类名。 - 属性名不匹配:Lyric实体中存储歌词的字段是
lyric(小写),但你创建数据时传的是Lyric(大写),导致字段赋值失败。 - 反向映射错误:Usuario实体的
@ManyToMany关联Song时,反向映射写的是song => Song.songId,这里应该指向Song实体中对应的关联字段(如果不需要多对多关联,可直接删除该字段,因为你已通过Song的Owner存储UserId)。
修正后的实体代码
Song实体
@Entity() export class Song { @PrimaryGeneratedColumn('uuid') SongId: string; @Column() // 保留原Owner字段存储UserId Owner: string; @OneToMany(type => Lyric, lyric => lyric.Song, { cascade: true }) Lyrics: Lyric[]; }
Usuario实体
@Entity() export class Usuario { @PrimaryGeneratedColumn('uuid') UsuarioId: string; // 若不需要多对多关联Song,可删除该字段 @ManyToMany(type => Song, song => song.UsuarioSongs) @JoinTable() Songs: Song[] | null; @OneToMany(type => Lyric, lyric => lyric.User) Lyrics: Lyric[] | null; }
Lyric实体
@Entity() export class Lyric { @PrimaryGeneratedColumn('uuid') LyricId: string; @Column() lyric: string; // 修正关联类为Usuario,添加nullable: false确保关联必填 @ManyToOne(type => Usuario, user => user.Lyrics, { nullable: false }) User: Usuario; @ManyToOne(type => Song, song => song.Lyrics, { nullable: false }) Song: Song; }
正确的单次保存代码
创建Song时,需给Lyric的User字段传入Usuario实体引用(用getReferenceById无需查询数据库),同时修正歌词字段名:
// 假设你已注入UsuarioRepository const userRef = this.usuarioRepository.getReferenceById(userId); const song = this.songRepository.create({ Owner: userId, Lyrics: [ { lyric: 'hello, hello, this is the lyric, etc etc', User: userRef }, { lyric: 'hello again, hello, this is the lyric, etc etc', User: userRef } ] }); await this.songRepository.save(song);
原写法失效原因
TypeORM的关系字段(如User: Usuario)需要接收实体对象或实体引用,直接传UserId字符串不会自动映射到关系字段。加上实体类名写错、属性名大小写不匹配,导致Lyric的User字段始终为空。修正后通过级联配置,保存Song时会自动保存关联的Lyric,并正确填充SongId和UserId。
内容的提问来源于stack exchange,提问作者Arellano Lahio
相关产品推荐
相关产品推荐

