JPA JoinColumn vs mappedBy

有什么区别:

@Entity public class Company { @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY) @JoinColumn(name = "companyIdRef", referencedColumnName = "companyId") private List<Branch> branches; ... } 

 @Entity public class Company { @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, mappedBy = "companyIdRef") private List<Branch> branches; ... } 

注解@JoinColumn表示这个实体是关系的所有者 (即:对应的表有一个带有被引用表的外键的列),而属性mappedBy则表示这个实体在关系,并且所有者居住在“其他”实体中。 这也意味着你可以从你用“mappedBy”注解的类(完全双向关系)访问另一个表。

特别是,对于问题中的代码,正确的注释将如下所示:

 @Entity public class Company { @OneToMany(fetch = FetchType.LAZY, mappedBy = "company") private List<Branch> branches; } @Entity public class Branch { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "companyId") private Company company; } 

@JoinColumn可以用在关系的两边。 问题是在@OneToMany方面使用@JoinColumn (罕见的情况)。 这里的要点是物理信息重复 (列名)以及未优化的SQL查询,这将产生一些额外的UPDATE语句

据文件记载 :

由于多对一 (几乎)总是JPA规范中双向关系的所有者端 ,因此一对多关联由@OneToMany(mappedBy = …)注释,

 @Entity public class Troop { @OneToMany(mappedBy="troop") public Set<Soldier> getSoldiers() { ... } @Entity public class Soldier { @ManyToOne @JoinColumn(name="troop_fk") public Troop getTroop() { ... } 

部队通过部队财产与士兵有双向一对多的关系。 你不必(不能)在mappedBy方面定义任何物理映射。

要将双向一对多映射为一对多的一面 ,必须删除mappedBy元素,并将多个@JoinColumn设置为可插入和可更新为false。 这个解决scheme没有被优化,并会产生一些额外的UPDATE语句。

 @Entity public class Troop { @OneToMany @JoinColumn(name="troop_fk") //we need to duplicate the physical information public Set<Soldier> getSoldiers() { ... } @Entity public class Soldier { @ManyToOne @JoinColumn(name="troop_fk", insertable=false, updatable=false) public Troop getTroop() { ... } 

映射的注释理想情况下应该始终在双向关系的父方(公司类)中使用,在这种情况下,它应该在Company类中指向Child类(Branch类)的成员variables“company”

注释@JoinColumn用于指定一个映射列来join一个实体关联,这个注释可以在任何类(Parent或Child)中使用,但理想情况下它只能用于一个方面(无论是在父类还是在Child类中)在这两种情况下)在这种情况下,我用它在分支类中指示外键的双向关系的子方(分支类)。

下面是工作的例子:

父类,公司

 @Entity public class Company { private int companyId; private String companyName; private List<Branch> branches; @Id @GeneratedValue @Column(name="COMPANY_ID") public int getCompanyId() { return companyId; } public void setCompanyId(int companyId) { this.companyId = companyId; } @Column(name="COMPANY_NAME") public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="company") public List<Branch> getBranches() { return branches; } public void setBranches(List<Branch> branches) { this.branches = branches; } } 

孩子class,科

 @Entity public class Branch { private int branchId; private String branchName; private Company company; @Id @GeneratedValue @Column(name="BRANCH_ID") public int getBranchId() { return branchId; } public void setBranchId(int branchId) { this.branchId = branchId; } @Column(name="BRANCH_NAME") public String getBranchName() { return branchName; } public void setBranchName(String branchName) { this.branchName = branchName; } @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="COMPANY_ID") public Company getCompany() { return company; } public void setCompany(Company company) { this.company = company; } } 

我只想补充一点, @JoinColumn并不总是必须与物理信息位置相关,正如这个答案所暗示的。 即使父表没有指向子表的数据,也可以将@JoinColumn@OneToMany结合使用。

如何在JPA中定义单向的OneToMany关系

单向OneToMany,没有反向ManyToOne,没有连接表

它似乎只在JPA 2.x+可用。 这对于希望子类只包含父代的ID的情况非常有用,而不是完整的引用。