0
こんにちは私は春のブートでJPA(休止状態)を使用しています。私は2つのエンティティクラスManyToOne常に実行中のクエリ(常に熱心に)
会社----->各社との双方向の関係を持つ従業員 が。(従業員へのcompnayからonetomany)複数のEMPを持って
会社エンティティを持っています
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 querieを発射されますS ..
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つのクエリが参加manytooneの結果です。私はそれを怠け者と言いましたが、依然として熱心に働いています。コードを変更してLazyにするにはどうすればよいですか(基本的にはこれらの3つのクエリの実行を停止する必要があります)。
私がコメントアウトしてもうまくいきますが、必要なら雇用者名は何ですか? –
@AnkitBansal Lazyは要求に応じてフェッチすることを意味します。 cmp.getEmployee()を呼び出すとそうすれば、従業員を連れてきます。あなたが従業員を取得できない限り、従業員の名前を得ることができない限り、必要なものがあります。会社IDに応じて従業員をフェッチする別の方法を書くこともできます:)。 –
私が求めているのは、要求が遅れているので、Employee to Companyは怠惰だから、getEmpName()を実行しているときに最後の3つのクエリがなぜ起きているのかということです。それは1つの従業員のクエリを起動するだけですか?ではない? –