You need to enable JavaScript to run this app. 如何修复Spring Boot表列自动生成bigint类型的问题
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Spring Boot表列自动生成bigint类型的问题

问题核心原因

默认情况下@ManyToOne关联会默认指向目标实体的主键字段,你的MeetingsSetting实体主键是Long类型的id字段,你没有指定关联的非主键字段,所以JPA会默认将外键字段的类型设为目标主键的bigint类型,和你实际要关联的String类型meeting_name不匹配。

具体修改点

  • 在MeetingTime的@JoinColumn注解中添加referencedColumnName = "meeting_name",显式指定关联目标实体的meeting_name字段,而非默认主键
  • 新增独立的String类型meetingName字段用于写入外键值,原有@ManyToOne关联字段保留insertable = false, updatable = false避免字段冲突
  • 建议调整关联属性命名符合驼峰规范,避免下划线导致的映射歧义

修改后代码示例

MeetingsSetting 实体

@Entity
@Table(name = "meeting_settings")
@Data
public class MeetingsSetting {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "meeting_name", unique = true)
    private String meetingName;

    @Column(name = "meeting_url")
    private String meetingUrl;

    @Column(name = "meeting_pw")
    private String meetingPw;

    // mappedBy对应MeetingTime里的关联属性名
    @OneToMany(mappedBy = "meetingsSetting", cascade = CascadeType.ALL)
    private Set<MeetingTime> meetingTime = new HashSet<>();
}

MeetingTime 实体

@Entity
@Table(name = "meeting_times")
@Data
public class MeetingTime {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "meeting_date")
    private String date;

    @Column(name = "start_time")
    private String startTime;

    @Column(name = "end_time")
    private String endTime;

    // 新增用于写入外键的字段
    @Column(name = "meeting_name")
    private String meetingName;

    @ManyToOne
    // 显式指定关联的目标字段
    @JoinColumn(name = "meeting_name" ,insertable = false, updatable = false, referencedColumnName = "meeting_name")
    private MeetingsSetting meetingsSetting;
}

修改后删除原有表重新生成DDL,外键meeting_name就会正确生成varchar类型,插入数据时先给meetingName字段赋值即可完成关联。

内容的提问来源于stack exchange,提问作者natyus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 15:36:07