2017-04-21 9 views
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つのクエリの実行を停止する必要があります)。

答えて

0

これは望ましくないようですが、遅延してエンティティをロードします。コメントしてください。

Set<Employee> ee = cmp.getEmployee(); 
    for(Employee e : ee){ 
     System.out.println(e.getEmpName()); 
    } 

また、従業員が依然として熱心に読み込まれているかどうかを確認してください。私はこれがログの理由だと思う

+0

私がコメントアウトしてもうまくいきますが、必要なら雇用者名は何ですか? –

+0

@AnkitBansal Lazyは要求に応じてフェッチすることを意味します。 cmp.getEmployee()を呼び出すとそうすれば、従業員を連れてきます。あなたが従業員を取得できない限り、従業員の名前を得ることができない限り、必要なものがあります。会社IDに応じて従業員をフェッチする別の方法を書くこともできます:)。 –

+0

私が求めているのは、要求が遅れているので、Employee to Companyは怠惰だから、getEmpName()を実行しているときに最後の3つのクエリがなぜ起きているのかということです。それは1つの従業員のクエリを起動するだけですか?ではない? –

関連する問題