Hibernate ManyToOne关联所有值为null的一对多配置问题求助
问题根因及修复方案
1. 首要原因:Product类supplier字段的@JoinColumn配置错误
你在Product类的supplier属性上给@JoinColumn设置了insertable=false, updatable=false,这两个属性的作用是告知JPA:插入、更新数据时不需要维护该字段对应的外键列,所以你保存Product的时候,关联供应商的外键字段根本不会被写入数据库,自然查询出来就是null。
修复方式:
删除这两个属性,同时可以显式指定外键列名(可选,默认规则是字段名+_id,即supplier_id):
@ManyToOne (cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }) @JoinColumn(name = "supplier_id") // 这里删掉原来的insertable、updatable属性 private Supplier supplier;
2. 次要注意点:双向关联需要手动维护双方关系
你用的是双向一对多关联,操作的时候不能只给Product设置supplier就完事,还要把对应的Product对象加入到Supplier的suppliedProducts列表中,否则级联保存或者直接查询Supplier的关联产品时,可能会出现数据不一致的问题。
示例操作代码:
// 新建供应商和产品 Supplier supplier = new Supplier(); Product product = new Product(); // 维护关联关系的两边 product.setSupplier(supplier); supplier.setSuppliedProducts(List.of(product)); // 保存操作 supplierRepository.save(supplier);
其他不影响当前问题的代码瑕疵(可选优化)
你代码里Product的categories多对多关联错误使用了@JoinColumn注解,多对多关联应该使用@JoinTable指定中间表配置,否则启动或者运行时会报错:
// 错误写法 @ManyToMany @JoinColumn(insertable=false, updatable=false) private List<Category> categories; // 正确写法示例 @ManyToMany @JoinTable(name = "product_category", joinColumns = @JoinColumn(name = "product_id"), inverseJoinColumns = @JoinColumn(name = "category_id")) private List<Category> categories;
内容的提问来源于stack exchange,提问作者Forges87
相关产品推荐
相关产品推荐

