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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:10:37