You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:55:21