TypeORM OneToMany关系下自定义列时自动新增countryId列问题咨询
修复@ManyToOne注解额外生成countryId列问题
问题原因
出现重复生成countryId列的核心原因是JPA字段映射冲突:@ManyToOne注解默认会自动生成「关联实体名+主键名」格式的外键列(即countryId),如果此时你没有显式指定关联字段的外键映射,或是同时单独声明了基础类型的countryId字段但未做关联配置,就会出现额外列。
修复方案
方案1:无需单独维护countryId基础字段
直接给@ManyToOne关联字段加@JoinColumn注解,指定你自定义的外键列名即可,JPA不会再自动生成默认的countryId列:
@ManyToOne // name属性填你自定义的列名,比如country_id @JoinColumn(name = "自定义外键列名") private Country country;
方案2:需要保留单独的countryId基础字段
如果你的业务需要直接操作countryId值,需要将两个字段映射到同一列,并设置关联字段为只读:
// 关联字段映射到自定义列,设置为不可插入、不可更新 @ManyToOne @JoinColumn(name = "自定义外键列名", insertable = false, updatable = false) private Country country; // 基础类型字段维护自定义列配置,负责外键值的写入更新 @Column(name = "自定义外键列名") private Long countryId;
验证步骤
修改配置后删除已生成的旧表,重启服务重新生成表结构即可确认问题是否修复。
内容的提问来源于stack exchange,提问作者Fahri Bullseye
相关产品推荐
相关产品推荐

