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。 此解决方案未经优化,将生成一些额外的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() {
...
}
映射理想地应该始终在双向关系的父方(公司类)中使用注释,在这种情况下,它应该在公司类中指向Child类(Branch类)的成员变量'company'
注释@JoinColumn用于指定加入实体关联的映射列,此注释可用于任何类(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;
}
}
孩子班,科
@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;
}
}
链接地址: http://www.djcxy.com/p/37009.html