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
相关产品推荐
相关产品推荐

