TypeORM(MySQL)无法创建ManyToOne/OneToMany关联问题排查
TypeORM多对一关联报错:Data type "Object" in "ReportsEntity.application" is not supported by "mysql" database
你的问题出在ReportsEntity的application字段同时使用了@PrimaryColumn和@ManyToOne装饰器,具体原因和修复方案如下:
问题根源
@ManyToOne装饰器用于建立实体间的关联关系,TypeORM会自动为这个关联生成对应的外键列。但你额外添加了@PrimaryColumn,这会让TypeORM将ApplicationsEntity实例识别为Object类型的主键列,而MySQL并不支持存储Object类型的数据,因此抛出错误。
另外,@CreateDateColumn和@UpdateDateColumn已经内置了type: 'timestamp'的配置,重复添加@Column({ type: 'timestamp' })属于冗余配置,可能引发潜在冲突。
修复后的代码
ReportsEntity
@Entity({name: "reports"}) export class ReportsEntity { @PrimaryGeneratedColumn('uuid') uuid: string; // 移除@PrimaryColumn,添加@JoinColumn明确外键列(可选,不添加会自动生成默认列名) @ManyToOne(() => ApplicationsEntity, (application) => application.reports) @JoinColumn({ name: "application_uuid" }) application: ApplicationsEntity @Column() description: string @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; }
若需将外键设为联合主键
如果你想把关联的外键作为ReportsEntity的联合主键一部分,需要单独定义主键列并关联:
@Entity({name: "reports"}) export class ReportsEntity { @PrimaryGeneratedColumn('uuid') uuid: string; @PrimaryColumn() application_uuid: string; @ManyToOne(() => ApplicationsEntity, (application) => application.reports) @JoinColumn({ name: "application_uuid" }) application: ApplicationsEntity @Column() description: string @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; }
关键说明
@ManyToOne会自动处理外键列的创建,无需手动用@PrimaryColumn标记关联字段;@JoinColumn用于指定外键列的名称,不指定时TypeORM会自动生成类似applicationUuid的列名;@CreateDateColumn/@UpdateDateColumn已经包含了时间戳类型配置,无需重复添加@Column。
内容的提问来源于stack exchange,提问作者Archonite
相关产品推荐
相关产品推荐

