Te rog ajută-mă să înțeleg unde să se utilizeze în mod regulat se ALĂTURE și de unde o ADUCE.
De exemplu, dacă avem aceste două interogări
FROM Employee emp
JOIN emp.department dep
și
FROM Employee emp
JOIN FETCH emp.department dep
Există vreo diferență între ele? Dacă da, pe care să o folosiți atunci când?
În aceste două întrebări, pe care îl utilizați se ALĂTURE pentru a interoga toți angajații care au cel puțin un departament asociat.
Dar, diferența este: în prima interogare nu se întorc numai Angajati pentru Hibernare. În cea de-a doua interogare, se intoarce la Angajati și toate Departamentele asociate.
Deci, dacă utilizați cea de-a doua interogare, nu veți avea nevoie pentru a face o nouă interogare pentru a lovi baza de date din nou pentru a vedea Departamentele de fiecare Angajat.
Puteți folosi de-a doua interogare atunci când sunteți sigur că veți avea nevoie de Departamentul de fiecare Angajat. Dacă nu ai nevoie de Departament, utilizați prima interogare.
Vă recomandăm citit acest link dacă aveți nevoie să se aplice unele în cazul în CARE condiția (ceea ce probabil va fi nevoie): https://stackoverflow.com/questions/5816417/how-to-properly-express-jpql-join-fetch-with-where-clause-as-jpa-2-criteriaq
Update
Dacă tu nu't folosi "aport" și Departamentele continua să fie returnate, pentru o mapare între Angajat și Departament (a @OneToMany
) este definită cu FetchType.DORNIC. În acest caz, orice HQL (cu "aport" sau nu) interogare cu
DE Angajat va aduce toate Departamentele. Amintiți-vă că toate cartografiere *ToOne (@ManyToOne " și " @OneToOne
) sunt DORNICI de default.
în acest link am menționat mai înainte pe comentariu, citit partea asta :
A "aduce" alăturați-vă permite asociațiilor sau colecții de valori să fie inițializat, împreună cu părinții lor obiecte, folosind un singur selectați. Acest lucru este deosebit de util în caz de o colecție. Se mod eficient suprascrie exterior alătura și leneș declarații de fișier de mapare pentru asociații și colecții.
acest "ALĂTURAȚI-vă ADUCE" va trebui s's efect dacă aveți (fetch = FetchType.LENEȘ) proprietate pentru o colecție în interiorul entității(exemplu mai jos).
Și acesta este doar efectul metoda de "atunci când interogarea ar trebui să se întâmple". Și tu trebuie să știi, de asemenea,this:
de hibernare au ortogonale două noțiuni : atunci când este asociația preluat și cum este preluat. Este important să nu le confunda. Vom folosi aduce pentru a regla performanța. Putem folosi leneș pentru a defini un contract pentru ce date este întotdeauna disponibil în orice detașat exemplu de un anumit clasa.
atunci când este asociația preluat --> "ADUCE" tip
cum este preluat --> Alăturați-vă/select/Subselect/Lot
În cazul tău, ADU-i va avea's efect dacă aveți departament ca un set în interiorul Angajat, ceva de genul asta din entitate:
@OneToMany(fetch = FetchType.LAZY)
private Set<Department> department;
atunci când utilizați
FROM Employee emp
JOIN FETCH emp.department dep
veți obține emp " și " emp.dep
. atunci când nu utilizați aduce mai poate fi emp.dep` dar hibernare va prelucrare alt selectați baza de date pentru a obține acel set de departament.
deci, ei doar o chestiune de tuning de performanță, despre doriți să obțineți toate rezultat(aveți nevoie de ea sau nu) într-o singură interogare(dornici de preluarea), sau doriți să interogare acesta din urmă, atunci când aveți nevoie de ea(leneș preluarea).
Utilizarea dornici de preluarea atunci când aveți nevoie pentru a obține date de mici dimensiuni cu un singur select(unul mare de interogare). Sau de a folosi leneș preluarea de a interoga ceea ce ai nevoie din urmă(mai mici de interogare).
utilizați aduce atunci când :
nu mare care nu sunt necesare colectarea/set interiorul acea entitate pe cale de a obține
comunicarea application server pentru a serverul de baze de date prea departe și au nevoie de mult timp
ai nevoie de colecție din urmă, atunci când tu nu't au acces la ea(afara de tranzacționale metoda/clasa)
Dacă aveți @oneToOne cartografiere setat la FetchType.LENEȘ și de a te folosi de-a doua interogare(pentru că ai nevoie de Departamentul de obiecte pentru a fi încărcat, ca parte a Angajaților obiecte) ce Hibernare va face, se va emite interogări pentru a prelua Departamentul de obiecte pentru fiecare Angajat individual obiect acesta preia de la DB. Mai târziu, în cod s-ar putea accesa Departamentul de obiecte prin intermediul Angajat la Departamentul singur a valoare de asociere și de Hibernare nu va emite nici o interogare pentru a prelua Departamentul de obiect pentru un anumit Angajat. Amintiți-vă Hibernare încă probleme de interogări egal cu numărul de Angajați a preluat. Hibernare va emite același număr de interogări în ambele întrebările de mai sus, dacă doriți să accesați Departamentul de obiecte de toate Angajat obiecte
Dherik : am'm nu sunt sigur de ceea ce spui, atunci când don't folosi aduce rezultatul va fi de tip : Lista<Object[ ]>
ceea ce înseamnă o listă de Obiect mese și nu o listă de Angajat.
Object[0] refers an Employee entity
Object[1] refers a Departement entity
Atunci când utilizați aduce, nu este doar o selectați și rezultatul este lista de Angajat Listă