建议使用 FetchType.LAZY。在需要时加入获取列
下面是 Employer 实体类,它映射到表雇主。如你所见,我使用了 fetch = FetchType.LAZY 而不是 fetch = FetchType.EAGER。我使用 LAZY 的原因是因为雇主可能会在以后拥有很多属性,并且每次我可能不需要知道雇主的所有领域,因此加载所有这些属性将导致糟糕的表现然后雇主被加载。
@Entity
@Table(name = "employer")
public class Employer
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String Name;
@OneToMany(mappedBy = "employer", fetch = FetchType.LAZY,
cascade = { CascadeType.ALL }, orphanRemoval = true)
private List<Employee> employees;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
但是,对于 LAZY 获取的关联,未初始化的代理有时会导致 LazyInitializationException。在这种情况下,我们可以简单地在 HQL / JPQL 中使用 JOIN FETCH 来避免 LazyInitializationException。
SELECT Employer employer FROM Employer
LEFT JOIN FETCH employer.name
LEFT JOIN FETCH employer.employee employee
LEFT JOIN FETCH employee.name
LEFT JOIN FETCH employer.address