Spring JPA一对多关联查询报错,无法获取含优惠券列表的公司
问题排查与解决
错误根源
报错信息明确说明:mappedBy指定的company_id在Coupon实体中不存在。这是因为@OneToMany的mappedBy属性需要填写关联实体(Coupon)中指向当前实体(Company)的Java属性名,而非数据库列名。你现在写的company_id是数据库表的列名,不是Coupon类里的属性名。
正确配置步骤
- 补全Coupon实体类的正确代码(你之前误粘贴成了Company类):
package Kinn.College.CouponManagementSystem.entities; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @Entity @Data @AllArgsConstructor @NoArgsConstructor @Table(name = "coupons") public class Coupon { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "coupon_id") private int id; // 示例优惠券属性,可根据实际需求调整 @Column(name = "coupon_title") private String title; @Column(name = "discount_rate") private double discountRate; // 关联Company的核心属性,属性名为`company` @ManyToOne @JoinColumn(name = "company_id") // 此处对应数据库外键列名 @ToString.Exclude // 避免Lombok生成toString时触发循环引用 private Company company; }
- 修正Company类中的@OneToMany配置
将mappedBy的值从company_id改为Coupon类中关联属性的名字company,同时建议初始化集合避免空指针:
// 原错误代码 // @OneToMany(mappedBy = "company_id", cascade = CascadeType.ALL) // 修正后代码 @OneToMany(mappedBy = "company", cascade = CascadeType.ALL) @ToString.Exclude // 同样避免循环引用问题 private List<Coupon> coupons = new ArrayList<>();
额外注意事项
- 初始化集合:必须给
coupons集合赋初始值(如new ArrayList<>()),否则后续添加优惠券时可能触发空指针异常。 - 循环引用规避:由于使用Lombok的
@Data会自动生成toString方法,双向关联场景下会导致栈溢出,因此必须在关联属性上添加@ToString.Exclude。 - 加载策略选择:
@OneToMany默认是懒加载(FetchType.LAZY),如果需要查询Company时立即加载所有Coupon,可显式指定fetch = FetchType.EAGER,但该策略可能影响性能,需按需使用。
内容的提问来源于stack exchange,提问作者Nati Shen-Gordon
相关产品推荐
相关产品推荐

