您好我正在使用Spring Data JPA(hibernate)和spring boot。
我有两个实体Class
公司----->雇员 与每个公司的双向关系有多个emp。(从compnay到员工的onetomany)
公司实体
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, mappedBy="company")
private Set<Employee> employee;
... Getters & Setters
}
员工实体
@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;
.... Getters & Setters ...
}
公司服务
public class CompanyService {
@Autowired
private CompanyRepository companyRepo;
public Company fetchCompany(int cmpId){
return companyRepo.findByCmpId(cmpId);
}
}
公司回购
public interface CompanyRepository extends JpaRepository<Company, Integer>{
public Company findByCmpId(int cmpId);
}
API代码(呼叫服务方法)
@RequestMapping("/cmp/{cmpId}")
public void findCmp(@PathVariable int cmpId){
Company cmp = cmpService.fetchCompany(cmpId);
System.out.println(cmp.getCompanyName());
Set<Employee> ee = cmp.getEmployee();
for(Employee e : ee){
System.out.println(e.getEmpName());
}
}
现在这个api代码正在触发5个查询..
Hibernate: select company0_.id as id1_1_, company0_.cmp_id as cmp_id2_1_, company0_.company_name as company_3_1_ from company company0_ where company0_.cmp_id=?
Hibernate: select employee0_.cmp_id as cmp_id4_2_0_, employee0_.id as id1_2_0_, employee0_.id as id1_2_1_, employee0_.cmp_id as cmp_id4_2_1_, employee0_.emp_id as emp_id2_2_1_, employee0_.emp_name as emp_name3_2_1_ from employee employee0_ where employee0_.cmp_id=?
Hibernate: select company0_.id as id1_1_0_, company0_.cmp_id as cmp_id2_1_0_, company0_.company_name as company_3_1_0_ from company company0_ where company0_.cmp_id=?
Hibernate: select company0_.id as id1_1_0_, company0_.cmp_id as cmp_id2_1_0_, company0_.company_name as company_3_1_0_ from company company0_ where company0_.cmp_id=?
Hibernate: select company0_.id as id1_1_0_, company0_.cmp_id as cmp_id2_1_0_, company0_.company_name as company_3_1_0_ from company company0_ where company0_.cmp_id=?
最后3个查询是多人加入的结果。虽然我已经提到它很懒但但它仍然在努力工作。如何更改我的代码以使其变为懒惰(基本上我需要停止触发这3个查询)。
答案 0 :(得分:0)
这似乎是不受欢迎的,但懒惰会按需加载实体。请注释掉,
Set<Employee> ee = cmp.getEmployee();
for(Employee e : ee){
System.out.println(e.getEmpName());
}
并检查雇员是否仍然渴望加载。我认为这是日志的原因