TypeORM关联表插入报错:idpersona无默认值,如何自动填充?
问题分析与解决
你遇到的这个报错是因为TypeORM实体关联配置存在两处关键问题,导致ORM无法自动填充idpersona外键值:
错误1:Contactos实体中persona字段类型错误
你把关联的实体字段定义成了string类型,但它应该是关联的Personas实体类型——只有这样TypeORM才能识别这是一个实体关联,进而自动处理外键的赋值逻辑。
错误2:重复定义了idpersona列
你在Contactos中既通过@Column手动定义了idpersona,又通过@JoinColumn指定这个字段为外键列。这种重复定义会造成冲突,TypeORM会把手动定义的idpersona当成普通字段处理,而非外键关联字段,自然无法通过实体关联自动填充值。
修正后的实体代码
Personas实体(调整关联映射目标)
@Entity('personas') export class Personas { @PrimaryGeneratedColumn() @IsNumber() id: number; @Column({type:"varchar",length:100}) @IsNotEmpty() nombre: string; // 修正关联的映射目标为contactos.persona,而非contactos.idpersona @OneToMany(type => Contactos, contactos => contactos.persona, {cascade: true}) contactos : Contactos[] }
Contactos实体(修正类型+移除重复列定义)
@Entity('contactos') export class Contactos { @PrimaryGeneratedColumn() @IsNumber() id: number; // 移除这里的@Column定义,@JoinColumn会自动创建idpersona外键列 // @Column() // @IsNotEmpty() // idpersona: number; // 修正类型为Personas实体 @ManyToOne(type => Personas) @JoinColumn({name: "idpersona"}) persona: Personas; @Column({type:"varchar",length:100}) nombre: string; @Column({type:"varchar",length:11}) telefono: string; }
修正后的逻辑说明
当你创建Personas并附带contactos数组时,因为开启了cascade: true,TypeORM会先保存Personas记录生成id,然后自动把这个id赋值给每个Contactos的persona关联对应的外键列(也就是idpersona),最后再批量保存所有Contactos记录。
修正后ORM能正确识别实体间的关联关系,就不会再出现Field 'idpersona' doesn't have a default value的报错了。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

