You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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<>();
    
}

错误原因

  1. 关联字段引用错误:Product类中@JoinTable的inverseJoinColumns指定referencedColumnName = "categoryName",但Category的主键是categoryId。多对多关联的中间表外键必须关联实体的主键,而非普通字段,这会导致Hibernate无法正确解析关联关系,触发映射异常。
  2. 潜在语法问题:如果集合初始化语句存在语法错误(比如漏写分号),会导致Lombok无法生成正确的getter方法,Hibernate找不到对应关联属性也会抛出该错误。

解决方案

  1. 修正关联字段引用:将Product类中inverseJoinColumns的referencedColumnName改为Category的主键categoryId,同时建议将中间表的外键字段名改为更清晰的product_id和category_id。
  2. 检查语法正确性:确保所有代码没有语法错误,比如集合初始化语句的分号、泛型写法都正确。
  3. 验证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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:05:28