Hibernate在MySQL中生成错误表关联的问题求助
问题分析
Hibernate额外生成alarm_alarm_lists和alarm_list_alarms表的原因在于:你的Alarm、AlarmList类中的@OneToMany注解未正确关联到ListAlarmJoinTable实体,Hibernate会默认给未指定关联关系的集合创建新中间表;同时ListAlarmJoinTable仅定义了复合主键,没有持有与Alarm、AlarmList的实体引用,导致Hibernate无法识别它是你指定的关联中间表。
解决方案
按以下步骤修改实体类:
1. 修正ListAlarmJoinTable,添加实体关联并映射复合主键
给ListAlarmJoinTable添加Alarm和AlarmList的引用,通过@MapsId将复合主键字段与实体关联绑定:
@Entity @NoArgsConstructor @AllArgsConstructor @Getter @Setter @Table(name = "list_alarms_join_table") public class ListAlarmJoinTable { @EmbeddedId private AlarmListId id; @ManyToOne @MapsId("alarmId") // 将嵌入ID的alarmId字段与当前alarm关联 @JoinColumn(name = "alarm_id") private Alarm alarm; @ManyToOne @MapsId("listId") // 将嵌入ID的listId字段与当前alarmList关联 @JoinColumn(name = "list_id") private AlarmList alarmList; private int position; }
2. 修正Alarm类的@OneToMany注解
指定mappedBy为ListAlarmJoinTable中的alarm属性,明确关联关系:
@Entity @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Table(name = "alarm") public class Alarm { // 其他字段保持不变 @OneToMany(orphanRemoval = true, cascade = {CascadeType.REMOVE, CascadeType.MERGE}, mappedBy = "alarm") private List<ListAlarmJoinTable> alarmLists; // toString方法保持不变 }
3. 修正AlarmList类的@OneToMany注解
指定mappedBy为ListAlarmJoinTable中的alarmList属性:
@Entity @NoArgsConstructor @AllArgsConstructor @Getter @Setter @ToString @Table(name = "alarm_list") public class AlarmList { // 其他字段保持不变 @OneToMany(orphanRemoval = true, cascade = {CascadeType.REMOVE, CascadeType.MERGE}, mappedBy = "alarmList") private List<ListAlarmJoinTable> alarms; }
4. 调整AlarmListId的字段映射(可选)
如果数据库列名与字段名不一致,添加@Column注解明确映射:
@Embeddable @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class AlarmListId implements Serializable { @Column(name = "alarm_id") private Integer alarmId; @Column(name = "list_id") private String listId; }
最后操作
- 执行
maven clean install清除旧编译文件 - 重启应用,Hibernate将仅生成你需要的
alarm、alarm_list、list_alarms_join_table三张表
内容的提问来源于stack exchange,提问作者codemaster1101
相关产品推荐
相关产品推荐

