FetchMode u hibernaciji
1. Uvod
U ovom ćemo kratkom vodiču pogledati drugačije FetchMode vrijednosti koje možemo koristiti u @org.hibernate.notacije.Dohvati bilješka.
2. Postavljanje primjera
Kao primjer koristit ćemo sljedeće Kupac entitet sa samo dva svojstva - id i skupom narudžbi:
@ Korisnik javne klase entiteta {@Id @GeneratedValue private Long id; @OneToMany (mappedBy = "kupac") @Fetch (value = FetchMode.SELECT) private Set naloga = new HashSet (); // geteri i postavljači}
Također ćemo stvoriti Narudžba entitet koji se sastoji od ID-a, imena i reference na Kupac.
@ Entity public class Order {@Id @GeneratedValue private Long id; privatni naziv niza; @ManyToOne @JoinColumn (name = "customer_id") privatni kupac; // geteri i postavljači}
U svakom od sljedećih odjeljaka dovest ćemo kupca iz baze podataka i dobiti sve njegove narudžbe:
Kupac kupac = customerRepository.findById (id) .get (); Postavi narudžbe = customer.getOrders ();
3. FetchMode.SELECT
Na naš Kupac entiteta, zabilježili smo naredbe nekretnina s a @ Dohvati napomena:
@OneToMany @Fetch (FetchMode.SELECT) privatno Postavi narudžbe;
Koristimo @ Dohvati kako bi opisao kako Hibernate treba dohvatiti svojstvo kada tražimo a Kupac.
Koristeći ODABERI ukazuje na to da bi imovinu trebalo lijeno učitati.
To znači da za prvi redak:
Kupac kupac = customerRepository.findById (id) .get ();
Nećemo vidjeti pridruživanje s tablicom narudžbi:
Hibernate: odaberite ... od kupca gdje je customer0_.id =?
I to za sljedeći redak:
Kupac kupac = customerRepository.findById (id) .get ();
Vidjet ćemo sljedeće upite za povezane narudžbe:
Hibernate: odaberite ... iz narudžbe gdje order0_.customer_id =?
The Hibernate FetchMode.IZBOR generira zasebni upit za svaku Narudžba koji treba učitati.
U našem primjeru to daje jedan upit za učitavanje kupaca i pet dodatnih upita za učitavanje kolekcije narudžbi.
Ovo je poznato kao n + 1 odabir problema. Pokrenuće se izvršavanje jednog upita n dodatni upiti.
3.1. @BatchSize
FetchMode.SELECT ima neobaveznu napomenu o konfiguraciji pomoću @BatchSize napomena:
@OneToMany @Fetch (FetchMode.SELECT) @BatchSize (size = 10) private Postavi narudžbe;
Hibernate pokušat će učitati kolekciju naloga u serijama definiranim veličina parametar.
U našem primjeru imamo samo pet narudžbi, tako da je dovoljan jedan upit.
I dalje ćemo koristiti isti upit:
Hibernate: odaberite ... iz narudžbe gdje order0_.customer_id =?
Ali pokrenut će se samo jednom. Sada imamo samo dva upita: Jedan za učitavanje Kupac i jedan za učitavanje zbirke narudžbi.
4. FetchMode.PRIDRUŽITE SE
Dok FetchMode.SELECT lijeno opterećuje odnose, FetchMode.PRIDRUŽITE SE učita ih željno, recite putem pridruživanja:
@OneToMany @Fetch (FetchMode.JOIN) privatno Postavi narudžbe;
To rezultira samo jednim upitom za oba Kupac i njihovi Narudžbas:
Hibernate: odaberite ... od kupca kupac0_ lijevi vanjski nalog za pridruživanje order1 na customer.id = order.customer_id gdje je customer.id =?
5. FetchMode.SUBSELECT
Jer naredbe svojstvo je zbirka, također bismo mogli koristiti FetchMode.SUBSELECT:
@OneToMany @Fetch (FetchMode.SUBSELECT) privatno Postavi narudžbe;
Možemo samo koristiti PODIZBOR sa kolekcijama.
Ovim postavljanjem vraćamo se na jedan upit za Kupac:
Hibernate: odaberite ... od kupca customer0_
I jedan upit za Narudžbas, koristeći ovaj put pod-odabir:
Hibernate: odaberite ... iz naloga order0_ gdje je order0_.customer_id u (odaberite customer0_.id od kupca customer0_)
6. FetchMode nasuprot FetchType
Općenito, FetchMode definira kako Hibernate dohvatit će podatke (odabirom, pridruživanjem ili podizborom). FetchType, s druge strane, definira hoće li Hibernate podatke učitati željno ili lijeno.
Točna pravila između ove dvije su sljedeća:
- ako se kod ne postavi FetchMode, zadani je PRIDRUŽITI i FetchType radi kako je definirano
- s FetchMode.SELECT ili FetchMode.SUBSELECT postaviti, FetchType također radi kako je definirano
- s FetchMode.PRIDRUŽITE SE postaviti, FetchType se zanemaruje, a upit je uvijek nestrpljiv
Za daljnje informacije pogledajte Nestrpljivo / lijeno utovar u hibernaciji.
7. Zaključak
U ovom uputstvu naučili smo o FetchModeRazličite vrijednosti, kao i kako su povezane FetchType.
Kao i uvijek sav izvorni kod dostupan je na GitHub-u.