Hibernate关联报错:mappedBy未知属性及JoinColumn配置咨询
嘿,我来帮你搞定这个Hibernate的关联错误~
首先看你遇到的错误:
org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: model.pilgi.Pilgi.PilgiDocument in model.pilgi_doc.PilgiDocument.pilgi
这个错误的核心原因是**@OneToMany的mappedBy参数写错了**。mappedBy需要指定的是关联实体(这里是Pilgi类)中,指向当前实体(PilgiDocument)的那个属性的名称,而不是类名。
第一步:修正代码中的关联配置
你当前的代码里,Pilgi类中关联PilgiDocument的属性名叫pdocument_id,但PilgiDocument的@OneToMany里写的是"PilgiDocument",完全不匹配,所以Hibernate找不到对应的属性。
修正后的PilgiDocument类:
@Entity @Table(name = "pilgi_document") public class PilgiDocument { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column private BigInteger pdocument_id; // 把mappedBy改成Pilgi类中对应的属性名pdocument_id @OneToMany(mappedBy = "pdocument_id") private List<Pilgi> pilgi = new ArrayList<>(); }
(可选)优化属性名提升可读性
你的Pilgi类中,pdocument_id这个属性名容易混淆(因为它是一个PilgiDocument对象,不是ID值),可以改成更清晰的名字,比如pilgiDocument,这样代码更直观:
优化后的Pilgi类:
@Entity @Table(name = "pilgi") public class Pilgi { // 其他属性... @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "pilga") // 改名后更清晰,明确这是一个PilgiDocument对象 private PilgiDocument pilgiDocument; }
对应的PilgiDocument类也要同步修改mappedBy:
@OneToMany(mappedBy = "pilgiDocument") private List<Pilgi> pilgiList = new ArrayList<>();
第二步:解释@JoinColumn的用法
@JoinColumn是用来指定关联关系中的外键列信息的,核心参数是name,它的含义是:
当前实体(比如Pilgi)对应的数据库表中,用来指向关联实体(PilgiDocument)主键的外键列的数据库名称。
举个例子:
- 如果你的
pilgi表中,有一个叫pilga的列,专门用来存储pilgi_document表的主键值(也就是外键),那你写@JoinColumn(name = "pilga")是完全正确的。 - 如果你的外键列实际叫
pdocument_id,那就要改成@JoinColumn(name = "pdocument_id")。
额外补充:如果关联实体的主键列名不是默认的(比如PilgiDocument的主键列叫doc_id而不是pdocument_id),还可以用referencedColumnName指定关联实体的主键列名,比如:
@JoinColumn(name = "pilga", referencedColumnName = "doc_id")
内容的提问来源于stack exchange,提问作者ziki

