本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看 活动链接
问题: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:stackoverflow.com/questions/1…
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END