You need to enable JavaScript to run this app. Spring Data JPA含外键复合主键映射时mappedBy配置报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data JPA含外键复合主键映射时mappedBy配置报错如何解决

解决方案

该报错是因为mappedBy指向的关联属性没有直接定义在CInvoice类的第一层字段中,而是嵌套在嵌入式复合主键CInvoiceId内部,JPA默认不会递归扫描嵌套类的字段作为关联目标,需要通过.语法指定完整的嵌套属性路径。

具体修改步骤

  • 第一步:修改Creditor类中@OneToMany注解的mappedBy值,完整路径为cInvoiceID.cInvoiceCreditorId,对应CInvoice类的主键字段名 + 主键类内部关联Creditor的字段名
    修改后的代码片段如下:
    @Entity
    @Table(name = "creditors")
    public class Creditor {
        @Id
        @GeneratedValue
        @Column(name = "id")
        private int creditorId;
    
        @Column(name = "name",nullable = false)
        private String creditorName;
    
        // 仅修改此处mappedBy的取值即可
        @OneToMany(mappedBy = "cInvoiceID.cInvoiceCreditorId")
        private List<CInvoice> cInvoices;
    }
    
  • 第二步:补全CInvoiceId类的无参构造函数,JPA规范要求所有可嵌入的主键类必须提供public级别的无参构造,否则后续还会触发实例化相关错误:
    @Embeddable
    public class CInvoiceId implements Serializable {
        @ManyToOne
        @JoinColumn(name = "creditors_id", nullable = false)
        private Creditor cInvoiceCreditorId;
        @Column(name = "invoice_id", nullable = false)
        private String cInvoiceId;
    
        // 新增无参构造
        public CInvoiceId() {
        }
    
        public CInvoiceId(Creditor creditor, String cInvoiceId){
            this.cInvoiceCreditorId = creditor;
            this.cInvoiceId = cInvoiceId;
        }
    
        //Setters, Getters, Equals and Hash保持原有实现即可
    }
    

验证说明

修改完成后重启项目即可正常映射关联关系,Creditor实体的cInvoices列表会自动关联所有对应供应商的发票记录,复合主键的约束也会正常生效,保证同一供应商下不会出现重复的发票编号。

内容的提问来源于stack exchange,提问作者Mr Dany

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 23:21:02