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

Hibernate嵌套复合主键实体类关联映射配置报错问题求助

问题修复方案

错误原因

Product实体的复合主键ProductKey一共包含3个关联列:

  • sku (ProductKey直接声明的字段)
  • lot (内嵌LotKey声明的字段)
  • company (内嵌LotKey中关联Company的外键列)
    你在QuantityProduct中关联Product时,只声明了sku和lot两个关联列,缺漏了company列的映射,导致JPA无法匹配完整的复合主键,抛出映射错误。

修复代码

修改QuantityProduct中Product的关联注解,补全所有主键列的映射:

@Entity
@Table(name = "quantityProduct")
public class QuantityProduct{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;
    
    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "sku", referencedColumnName = "sku"),
            @JoinColumn(name = "lot", referencedColumnName = "lot"),
            // 补全复合主键中company列的映射,可根据实际表结构自定义name属性值
            @JoinColumn(name = "product_company_id", referencedColumnName = "company")
    })
    private Product product;
    
    @Column(name = "quantity", columnDefinition = "double(8,2) default 0")
    private double quantity;
}

额外优化建议

当前Product实体中同时存在主键内嵌的LotKey.company和单独声明的company字段,两个字段都映射了公司外键,容易出现数据不一致,建议给单独声明的company字段加上@MapsId注解,关联主键中的company属性,避免冗余映射:

// 修改Product类中的company字段注解
@ManyToOne
@MapsId("lot.company") // 关联ProductKey内嵌LotKey中的company属性
@JoinColumn(name = "companyId", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
private Company company;

内容的提问来源于stack exchange,提问作者Andres Ghione

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:42:02