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

