使用@EmbeddedId定义复合主键时Hibernate为何生成额外独立表?
问题原因
Player实体中定义的stats一对多关联没有指定mappedBy属性,未明确关联关系由PlayerStat侧维护,JPA对未配置mappedBy的单向@OneToMany默认采用中间关联表的方式存储关联关系,因此自动生成了多余的player_stats表。
修复方案
修改Player类中stats属性的@OneToMany注解,添加mappedBy指定关联维护方:
// 修改前 // @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) // private Set<PlayerStat> stats; // 修改后 @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "key.player") private Set<PlayerStat> stats;
说明
mappedBy的值key.player对应PlayerStat实体中关联Player的属性路径:PlayerStat的主键是key属性,key属性内部的player字段指向所属的Player实体,因此需要写全路径。- 修复后关联关系将直接通过
player_stat表的player_id外键维护,不会再生成多余的中间表,和预期的表结构、查询逻辑完全一致。
内容的提问来源于stack exchange,提问作者oa54
相关产品推荐
相关产品推荐

