Spring Boot JPA映射Oracle复合主键关联实体缺失注解咨询
问题修正方案
你的现有代码存在两个核心问题,调整后即可完成正确映射:
- 关联注解类型错误:你目前使用的
@OneToOne不符合表结构关系,T1和T2实际为一对多关系,T2侧应该使用@ManyToOne注解 - 缺少外键列映射配置:需要通过
@JoinColumns指定T2中对应T1主键的4个外键列,同时因为这4个列已经在T2的嵌入式主键T2PK中定义,需要设置insertable = false, updatable = false避免字段重复维护冲突。
修改后的T2Bean完整代码如下:
import java.io.Serializable; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.ManyToOne; import javax.persistence.JoinColumn; import javax.persistence.JoinColumns; import javax.persistence.Table; import lombok.Data; @Entity @Table(name = "T2") @Data public class T2Bean implements Serializable { @EmbeddedId private T2PK pk; @Basic @Column(name = "C7", nullable = false) private String c7; @Basic @Column(name = "C8", nullable = false) private String c8; // 调整后的关联配置 @ManyToOne @JoinColumns({ @JoinColumn(name = "C1", referencedColumnName = "C1", insertable = false, updatable = false), @JoinColumn(name = "C2", referencedColumnName = "C2", insertable = false, updatable = false), @JoinColumn(name = "C3", referencedColumnName = "C3", insertable = false, updatable = false), @JoinColumn(name = "C4", referencedColumnName = "C4", insertable = false, updatable = false) }) private T1Bean t1Bean; }
后续操作T2时,仅需要给主键T2PK里的C1-C4字段赋值,JPA会自动关联到对应的T1记录,不会出现字段重复映射的报错。
内容的提问来源于stack exchange,提问作者dani77
相关产品推荐
相关产品推荐

