JPA报错pricing_a列不存在,@OneToMany关联Map<VC,P>实体持久化失败
问题根因
- 关联表配置缺失值实体的反向外键映射
你在B实体的@JoinTable注解中仅配置了指向主实体B的joinColumns、指向Map键实体VC的@MapKeyJoinColumns,完全没有配置指向Map值实体P的inverseJoinColumns。JPA默认会根据Map属性名自动拼接生成关联字段名,你的Map属性名为pricing,因此自动生成了pricing_a这类不存在的字段,触发字段不存在的报错。 - P实体标注了冲突注解
P是独立存储的数据库实体,同时加了@Entity和@Embeddable注解,@Embeddable是用于嵌入到其他实体的类型注解,和@Entity冲突,会干扰JPA的映射解析逻辑。
修改方案
第一步:修正B实体pricing属性的关联表配置,补充反向外键映射
@OneToMany(cascade = CascadeType.ALL) @JoinTable( name = "b_p", joinColumns = @JoinColumn(name = "b_name", referencedColumnName = "name"), // 新增以下反向外键配置,对应P的复合主键字段 inverseJoinColumns = { @JoinColumn(name = "a", referencedColumnName = "a"), @JoinColumn(name = "d_a", referencedColumnName = "d_a") } ) @MapKeyJoinColumns({ @MapKeyJoinColumn(name = "p_c"), @MapKeyJoinColumn(name = "c_id") }) private Map<VC, P> pricing = new LinkedHashMap<>();
第二步:删除P实体上的冲突注解@Embeddable
@Setter @Getter @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "p") public class P implements Serializable { @EmbeddedId private PId pId; }
修改完成后,无论是直接调用bRepo.save(b)级联保存所有关联实体,还是先单独保存P集合再保存B,都可以正常执行,不会再触发字段不存在的错误。
内容的提问来源于stack exchange,提问作者mr nooby noob
相关产品推荐
相关产品推荐

