問題: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;...
}
回答一
mappedBy注解按道理應該用于雙向關系中的父類(company類)里面的。在這種情況下,它應該用在Company類指向它子類(Branch類)的成員變量’company’
JoinColumn注解通常被用于說明映射列(用于連接一個實體關系的),這個注解可以用在任何類里面(父類和子類),但是按道理來說只能用在一類(要么是父類要么是子類),這里的例子中,我是用在了雙向關系里的子類那里,去顯示出子類(Branch類)里面的一個外鍵
下面是一個例子:
父類,Company
@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;}}
子類,Branch
@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指明了這個實體是關系的擁有者(對應著一個擁有外鍵的表和它的參照表)。但是mappedBy屬性指明的是在這一邊的實體是一個逆向的關系,而擁有者是在另一個實體里面的。這也意味著你可以在這個類里面使用到你標注了mappedBy其他表(完全雙向關系)
另外,對于問題中的代碼來說,正確的注解應該是下面這樣的:
@Entity
public class Company {@OneToMany(mappedBy = "company",orphanRemoval = true,fetch = FetchType.LAZY,cascade = CascadeType.ALL)private List<Branch> branches;
}@Entity
public class Branch {@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "companyId")private Company company;
}
文章翻譯自Stack Overflow:https://stackoverflow.com/questions/11938253/jpa-joincolumn-vs-mappedby