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.


$config[zx-auto] not found$config[zx-overlay] not found