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

Quarkus中Hibernate OneToMany与JoinTable复合键映射问题

解决方案

问题根源

  1. 实体映射冗余:DuckMissionEntity里除了嵌入的复合主键id,还额外定义了duckId和missionId字段,这会让Hibernate重复映射duck_id和mission_id列。
  2. @JoinTable用错场景:duck_mission本身是关联实体表,不是单纯的连接表,没必要用@JoinTable来映射一对多关系,直接关联DuckMissionEntity即可。

修正后的实体代码

先调整DuckMission实体

删掉冗余的duckId和missionId字段,通过嵌入的主键访问对应值,可选添加双向关联(根据业务需求):

@Data
@Embeddable
class DuckMissionEntityId implements Serializable {

    @Column(name = "duck_id")
    public UUID duckId;

    @Column(name = "mission_id")
    public UUID missionId;
}

@Entity
@Table(name = "duck_mission")
public class DuckMissionEntity extends PanacheEntityBase {

    @EmbeddedId
    public DuckMissionEntityId id;

    // 可选:添加与Duck的双向关联
    @ManyToOne
    @JoinColumn(name = "duck_id", insertable = false, updatable = false)
    public DuckEntity duck;

    // 其他getter和setter
}

再调整Duck实体

如果用双向关联,就用mappedBy指定关联字段:

@Entity
@Table(name = "duck")
public class DuckEntity extends PanacheEntityBase {

    @Id
    @GeneratedValue
    @Column(name = "id")
    public UUID id;

    @OneToMany(mappedBy = "duck")
    public List<DuckMissionEntity> duckMissions;

    // 其他字段、getter和setter
}

如果不需要双向关联,直接用@JoinColumns映射:

@Entity
@Table(name = "duck")
public class DuckEntity extends PanacheEntityBase {

    @Id
    @GeneratedValue
    @Column(name = "id")
    public UUID id;

    @OneToMany
    @JoinColumns({
            @JoinColumn(name = "duck_id", referencedColumnName = "id")
    })
    public List<DuckMissionEntity> duckMissions;

    // 其他字段、getter和setter
}

关于Quarkus复合键的说明

Quarkus对Hibernate复合键的支持和标准Hibernate完全一致,没有特殊限制。之前出错纯粹是实体映射逻辑的问题,和Quarkus框架无关。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:05:45