Spring Boot Hibernate多对多关联映射异常排查求助
多对多关联配置引发Hibernate MappingException的原因及解决办法
运行Spring Boot应用时出现以下错误:
org.hibernate.MappingException: property-ref [_com_eCommerce_ecommerce_model_Product_listOfCategories] not found on entity [com.eCommerce.ecommerce.model.Product]
原代码
Product类
package com.eCommerce.ecommerce.model; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @NoArgsConstructor @Entity @Getter @Setter @Table(name="Product") public class Product { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private int productId; private int stockNumber; @ManyToMany @JoinTable(name = "products_categories", joinColumns = { @JoinColumn(name = "product",referencedColumnName = "productId",nullable = false,updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "category",referencedColumnName = "categoryName",nullable = false,updatable = false) }) Set<Category> listOfCategories = new HashSet<>(); }
Category类
package com.eCommerce.ecommerce.model; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @Data @NoArgsConstructor @Entity @Table(name = "Category") public class Category { private int categoryParentNumber; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private int categoryId; private String categoryName; @ManyToMany(mappedBy = "listOfCategories",fetch = FetchType.LAZY) private Set<Product> listOfProducts = new HashSet<>(); }
错误原因
- 关联字段引用错误:Product类中
@JoinTable的inverseJoinColumns指定referencedColumnName = "categoryName",但Category的主键是categoryId。多对多关联的中间表外键必须关联实体的主键,而非普通字段,这会导致Hibernate无法正确解析关联关系,触发映射异常。 - 潜在语法问题:如果集合初始化语句存在语法错误(比如漏写分号),会导致Lombok无法生成正确的getter方法,Hibernate找不到对应关联属性也会抛出该错误。
解决方案
- 修正关联字段引用:将Product类中
inverseJoinColumns的referencedColumnName改为Category的主键categoryId,同时建议将中间表的外键字段名改为更清晰的product_id和category_id。 - 检查语法正确性:确保所有代码没有语法错误,比如集合初始化语句的分号、泛型写法都正确。
- 验证Lombok注解:确认
@Getter/@Setter(Product类)和@Data(Category类)能正常生成getter方法,Hibernate依赖这些方法访问关联集合。
修正后的代码
Product类
package com.eCommerce.ecommerce.model; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @NoArgsConstructor @Entity @Getter @Setter @Table(name="Product") public class Product { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private int productId; private int stockNumber; @ManyToMany @JoinTable(name = "products_categories", joinColumns = { @JoinColumn(name = "product_id", referencedColumnName = "productId", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "category_id", referencedColumnName = "categoryId", nullable = false, updatable = false) }) private Set<Category> listOfCategories = new HashSet<>(); }
Category类
package com.eCommerce.ecommerce.model; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.*; import java.util.HashSet; import java.util.Set; @Data @NoArgsConstructor @Entity @Table(name = "Category") public class Category { private int categoryParentNumber; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private int categoryId; private String categoryName; @ManyToMany(mappedBy = "listOfCategories", fetch = FetchType.LAZY) private Set<Product> listOfProducts = new HashSet<>(); }
内容的提问来源于stack exchange,提问作者Alphan
相关产品推荐
相关产品推荐

