如何修复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
相关产品推荐
相关产品推荐

