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

Spring Boot中基于字符串主键/外键建立一对多关联的问题

修复Airports与AirportComments的OneToMany关联问题

错误原因

原代码在AirportComments的String类型字段airportIdent上标注了@OneToMany,JPA要求关联注解只能指向实体类,而String不是JPA实体,因此触发Association targets an unknown entity named 'java.lang.String'错误。同时Airports实体的主键配置也有误,@Id和@OneToMany不能同时标注在同一个字段上。

修正后的实体代码

Airports 实体类

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.List;

@Entity
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Airports {
    // 以ident作为主键,移除自动生成的long id(若需保留需避免多主键冲突)
    @Id
    private String ident;
    
    private String type;
    private String name;
    private String lattitude_deg;
    private String longitute_deg;
    private long elevation_ft;
    private String continent;
    private String iso_country;
    private String iso_region;
    private String municipality;
    private String scheduled_service;
    private String gps_code;
    private String iata_code;
    private String local_code;
    private String home_link;
    private String wikipedia_link;
    private String keywords;

    // 一对多关联AirportComments,mappedBy指定由子实体维护关联关系
    @OneToMany(mappedBy = "airport")
    private List<AirportComments> comments;
}

AirportComments 实体类

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.Data;
import java.sql.Date;

@Entity
@Data
public class AirportComments {
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private long id;
    
    private long threadRef;
    private long airportRef;
    
    // 多对一关联Airports实体,外键字段为airportIdent,关联到Airports的ident主键
    @ManyToOne
    @JoinColumn(name = "airportIdent", referencedColumnName = "ident")
    private Airports airport;
    
    private Date date;
    private String memberNickname;
    private String subject;
    private String body;
}

关键修正点

  • Airports实体:移除了与主键冲突的long id字段,将@OneToMany标注在List<AirportComments>集合上,通过mappedBy指定关联关系由子实体维护。
  • AirportComments实体:将原String airportIdent字段替换为Airports实体引用,使用@ManyToOne建立多对一关联,通过@JoinColumn明确数据库外键列名与关联的主键字段。

内容的提问来源于stack exchange,提问作者DILIP KUMAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:44:54