Spring JPA+Hibernate如何正确映射同一实体的多个关联关系
关联关系正确配置方案
问题根因
Flight实体中两个关联Airport的属性共用了同一个外键名airport_id,数据库表中不允许同名字段,违反JPA映射规则Airport中@OneToMany的mappedBy属性指向了Flight中不存在的字段,触发对应报错:
mappedBy reference an unknown target entity property (airport-flights)
第一步:修改Flight实体映射
修正两个外键的列名,保证不重复即可:
public class Flight { // 其余代码保持不变 @ManyToOne @JoinColumn(name = "start_airport_id", referencedColumnName = "id") private Airport startLocation; @ManyToOne @JoinColumn(name = "dest_airport_id", referencedColumnName = "id") private Airport destination; // 其余代码保持不变 }
第二步:修改Airport实体的反向关联
mappedBy的值必须严格对应Flight中关联属性的字段名,分别配置两个航班列表的映射:
public class Airport { // 其余代码保持不变 // 对应从当前机场出发的航班 @OneToMany(mappedBy = "startLocation") private List<Flight> departureFlights; // 对应降落到当前机场的航班 @OneToMany(mappedBy = "destination") private List<Flight> arrivalFlights; // 其余代码保持不变 }
额外说明
- 如果需要级联操作,可以在
@OneToMany注解中补充cascade属性,比如cascade = CascadeType.ALL,根据业务需求选择即可 - 如果不需要从机场侧反向查询关联航班,也可以直接删除Airport中的两个
@OneToMany属性,仅保留Flight中的两个@ManyToOne关联也能正常运行
内容的提问来源于stack exchange,提问作者stijuh
相关产品推荐
相关产品推荐

