JPA基于主键建立实体一对一关联报错:referenced property unknown
问题描述
尝试使用JPA在两个实体间建立一对一关联,但其中一个类出现“referenced property unknown”错误。数据库模型为:appraisal表的vehicle_id列关联到vehicle表的id字段。
相关实体代码如下:
Appraisal类
@Entity @Table(name = "appraisal") @Data @IdClass(AppraisalId.class) public class Appraisal { @Id @Column(name="vehicle_id") private Long vehicleId; @PrimaryKeyJoinColumn @OneToOne(mappedBy = "appraisal") private Vehicle vehicle; @Id @Column(name="customer_id") private Long customerId; @OneToOne @JoinColumn(name="appraised_for", referencedColumnName="id") private Customer customer; //1列省略 }
AppraisalId类
@Data public class AppraisalId implements Serializable { private static final long serialVersionUID = -5373569618334807665L; private Long vehicleId; private Long customerId; }
Vehicle类
@Entity @Table(name = "vehicle") @Getter @Setter public class Vehicle { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") private Long id; @OneToOne(mappedBy = "vehicle") private Appraisal appraisal; //其他列省略 }
使用Lombok的@Data注解生成getter和setter,错误信息为:Unknown mappedBy in: ca.allauto.ups.model.Appraisal.vehicle, referenced property unknown: ca.allauto.ups.model.Vehicle.appraisal
错误原因
你搞反了一对一关联的所有者方和被动方:
- appraisal表通过
vehicle_id(作为复合主键的一部分)关联vehicle表,因此Appraisal是关联的所有者方(拥有外键的一方),不需要使用mappedBy属性——mappedBy是给被动方(无外键的一方,也就是Vehicle)用的,用来指定所有者方中维护关联的字段。 - 你在
Appraisal的vehicle字段上添加了mappedBy = "appraisal",这会让JPA去Vehicle类中找名为appraisal的字段来维护关联,但实际上Vehicle里的appraisal字段是用mappedBy = "vehicle"指向Appraisal的vehicle字段,这就导致了循环引用的配置错误。
修正方案
修改Appraisal类中的vehicle字段配置,去掉mappedBy,并明确@PrimaryKeyJoinColumn的关联字段:
@Entity @Table(name = "appraisal") @Data @IdClass(AppraisalId.class) public class Appraisal { @Id @Column(name="vehicle_id") private Long vehicleId; @OneToOne @PrimaryKeyJoinColumn(name = "vehicle_id", referencedColumnName = "id") private Vehicle vehicle; @Id @Column(name="customer_id") private Long customerId; @OneToOne @JoinColumn(name="appraised_for", referencedColumnName="id") private Customer customer; //1列省略 }
Vehicle类的配置不需要修改,因为它的@OneToOne(mappedBy = "vehicle")已经正确指向了Appraisal中维护关联的vehicle字段。
这样配置后,JPA就能正确识别关联关系:Appraisal通过主键字段vehicle_id关联Vehicle的主键id,Vehicle通过mappedBy被动关联Appraisal的vehicle字段。
内容的提问来源于stack exchange,提问作者Rob Gravelle
相关产品推荐
相关产品推荐

