Spring Data JPA @ManyToMany配置触发Unknown column报错问题咨询
报错原因
核心是@ManyToMany注解的中间表关联配置错误:
- 中间表
t_user_fav_resto只有user_id、resto_id两个外键字段,不存在名为id的关联字段。但你在User类的@JoinTable配置中,将inverseJoinColumns的name属性错写为id,导致JPA生成SQL时错误尝试用中间表的id字段关联餐厅表主键,触发字段不存在报错。 - 额外低级错误:User类中
favoriteRestos属性的泛型错写为MusicStyle,和关联的实体类Resto不匹配。 - 双向多对多重复配置了
@JoinTable:Resto类也配置了同一张中间表的@JoinTable,不符合JPA双向关联的规范(需一方为维护端,另一方用mappedBy声明关联关系),容易引发额外的关联逻辑错误。
修复方案
1. 修正User类(作为多对多关系维护端)的配置
@ManyToMany @JoinTable(name="t_user_fav_resto", joinColumns=@JoinColumn(name="user_id"), // 中间表关联User主键的字段名 inverseJoinColumns=@JoinColumn(name="resto_id")) // 中间表关联Resto主键的字段名 @JsonIgnore private Set<Resto> favoriteRestos = new HashSet<>(); // 修正泛型为Resto
2. 修正Resto类(作为多对多关系被维护端)的配置
移除重复的@JoinTable,改用mappedBy指向User类中对应的关联属性名:
@ManyToMany(mappedBy = "favoriteRestos") @JsonIgnore private Set<User> users = new HashSet<>();
3. 可选修正Repository方法的硬编码问题
原方法的@Query硬写了用户ID为1559,传入的userId参数不会生效,建议改为参数绑定,同时加fetch实现关联属性立即加载,避免懒加载异常:
@Query("select u from User u left join fetch u.favoriteRestos s where u.id = :userId ") User findByIdWithFavoriteRestos (@Param("userId") Long userId);
内容的提问来源于stack exchange,提问作者Nunyet Calçada
相关产品推荐
相关产品推荐

