我觉得 MapsId 和 JoinColumn with referencedColumnName 应该已经使用了。如果不是为什么?他在同一页面的所有其他示例中都使用了上述内容。
在您提供的示例中,他在关系的另一端使用mappedBy 属性,其中存在OneToMany。这个 mappedBy 属性为 JPA 提供了必要的信息,以了解这两个实体之间的关系。请记住,实体字段代表数据库中的列,JPA 知道这些列是什么。
使用mappedBy 的实体表示另一方的另一个实体是这两个实体之间关系的所有者。
@ManyToOne 没有mappedBy 属性,因为默认情况下,当您同时拥有@OneToMany 和@ManyToOne 时,拥有@ManyToOne 的一方是关系的所有者。所以@ManyToOne 上不存在mappedBy 来短路这个默认机制。
但是有一种方法可以使具有@ManyToOne 的实体成为关系的所有者。您还必须在@ManyToOne 上面加上@JoinColumn(name = "ref", referencedColumnName = "ref2")
总结您指向的示例使用默认机制,其中带有@ManyToOne 的一侧是关系的所有者,并且直接从另一侧用@OneToMany 上的 mappedBy 属性。
奖金
@JoinColumn(name = "student_id") 不带 referencedColumnName 不用于指示关系的所有者方,而是通知 JPA 将用作外键的额外列与实体有。所以它只是用来覆盖JPA将用作外键的外键列名,与java字段名不同。
至于@MapsId,请查看answer 以更好地了解它的使用方式