Quarkus中Hibernate OneToMany与JoinTable复合键映射问题
解决方案
问题根源
- 实体映射冗余:
DuckMissionEntity里除了嵌入的复合主键id,还额外定义了duckId和missionId字段,这会让Hibernate重复映射duck_id和mission_id列。 - @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
相关产品推荐
相关产品推荐

