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

