我想了解n + 1問題,從而找到適當的修復方法。JPA Hibernate n + 1問題(Lazy&Eager Diff)
我有兩個實體: 公司
@Entity
@Table(name="company")
public class Company implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private int id;
@Column(name="cmp_id")
private int cmpId;
@Column(name="company_name")
private String companyName;
@OneToMany(fetch=FetchType.LAZY)
@JoinColumn(name="cmp_id",referencedColumnName="cmp_id")
private Set<Employee> employee;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getCmpId() {
return cmpId;
}
public void setCmpId(int cmpId) {
this.cmpId = cmpId;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public Set<Employee> getEmployee() {
return employee;
}
public void setEmployee(Set<Employee> employee) {
this.employee = employee;
}
}
員工
@Entity
@Table(name="employee")
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private int id;
@Column(name="emp_id")
private int empId;
@Column(name="emp_name")
private String empName;
/*@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="cmp_id", referencedColumnName="cmp_id")
@JsonIgnore
private Company company;*/
@Column(name="cmp_id")
private int cmpId;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
}
每個公司有很多員工。如此簡單的單方向一對多關係。 現在,當我運行查詢(「選擇從公司a」),我面臨n + 1選擇(當我試圖讓員工)
但更清楚地理解這些概念,當我改變它對EAGER來說,所有相同的n + 1個查詢最初都在運行(即使我沒有取得該員工)。這是正確的行爲嗎?我的意思是它不應該激發連接查詢。另外,如何使用EAGER更改代碼以僅生成1個查詢。
使用聯合抓取,抓取類型應該是懶惰還是渴望?和什麼是不同的B/W懶惰和渴望與聯合Fetch? –
使用JOIN FETCH可以覆蓋每個渴望的映射策略。那麼映射是什麼並不重要。我會建議在映射中使用LAZY。 –