2017-04-21 1 views
0

Hallo Ich benutze Spring Data JPA (Winterschlaf) mit Spring Boot.ManyToOne immer laufende Abfragen (immer eifrig)

ich zwei Einheiten der Klasse habe

Unternehmen -----> Mitarbeiter mit bidirektionaler Beziehung mit jeder Firma haben mehrere emp. (OneToMany von compnay zu Mitarbeiter)

Unternehmen Entity

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 

} 

Mitarbeiter Entity

@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 ... 
} 

Unternehmen Service

public class CompanyService { 

    @Autowired 
    private CompanyRepository companyRepo; 

    public Company fetchCompany(int cmpId){ 
     return companyRepo.findByCmpId(cmpId); 
    } 
} 

Firma Repo

public interface CompanyRepository extends JpaRepository<Company, Integer>{ 
    public Company findByCmpId(int cmpId); 
} 

API-Code (Calling Service-Methode)

@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()); 
     } 
    } 

Nun ist diese api Code feuert 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=? 

Die letzten 3 Abfragen sind Ergebnis von manytoone verbinden. obwohl ich es faul erwähnt habe, aber es arbeitet immer noch so eifrig. Wie ändere ich meinen Code, um es Lazy zu machen (im Grunde muss ich aufhören, diese 3 Abfragen zu feuern).

Antwort

0

Dies scheint unerwünscht, aber faul lädt die Entitäten auf Nachfrage. Bitte kommentieren Sie aus,

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

Und überprüfen Sie, ob die Mitarbeiter noch eifrig geladen sind. Ich denke, das ist der Grund für die Protokolle

+0

Es funktioniert gut, wenn ich kommentieren, aber was ist, wenn die Mitarbeiter Name benötigen? –

+0

@AnkitBansal Wie die Lazy impliziert, holen sie auf Abruf. wenn Sie cmp.getEmployee() aufrufen. Dann bringt es die Mitarbeiter, das ist was du brauchst, richtig, es sei denn, du bekommst die Angestellten, du kannst die Namen der Angestellten nicht bekommen. Sie können auch eine andere Methode zum Abrufen von Arbeitsplätzen schreiben, abhängig von der Firmen-ID :). –

+0

Was ich fragen ist, dass seit Faul holt auf Anfrage, Mitarbeiter zu Unternehmen ist faul, also warum die letzten 3 Abfragen auslösen, wenn ich getEmpName() tun. Es sollte nur eine Mitarbeiteranfrage auslösen? Ist es nicht? –