You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:45:03