FetchMode v režime dlhodobého spánku

1. Úvod

V tejto krátkej príručke sa pozrieme na rôzne veci FetchMode hodnoty, ktoré môžeme použiť v @org.hibernate.annotations.Fetch anotácia.

2. Príprava príkladu

Ako príklad použijeme nasledujúce Zákazník entita iba s dvoma vlastnosťami - ID a skupinou objednávok:

@Entity public class Zákazník {@Id @GeneratedValue private Long id; @OneToMany (mappedBy = "zákazník") @Fetch (hodnota = FetchMode.SELECT) súkromné ​​nastavenie objednávok = nový HashSet (); // zakladatelia a zakladatelia}

Vytvoríme tiež objednať entita pozostávajúca z id, mena a odkazu na Zákazník.

@Entity public class Order {@Id @GeneratedValue private Long id; súkromné ​​meno reťazca; @ManyToOne @JoinColumn (name = "customer_id") súkromný zákazník zákazníka; // zakladatelia a zakladatelia}

V každej z nasledujúcich sekcií načítame zákazníka z databázy a získame všetky jeho objednávky:

Zákazník zákazník = customerRepository.findById (id) .get (); Nastaviť objednávky = customer.getOrders ();

3. FetchMode.SELECT

Na našom Zákazník entitu, anotovali sme objednávky nehnuteľnosť s a @ Načítať anotácia:

@OneToMany @Fetch (FetchMode.SELECT) súkromné ​​nastavenie objednávok;

Používame @ Načítať popísať, ako by mal režim dlhodobého spánku načítať vlastnosť, keď hľadáme a Zákazník.

Použitím VYBERTE označuje, že vlastnosť by sa mala načítať lenivo.

To znamená, že pre prvý riadok:

Zákazník zákazník = customerRepository.findById (id) .get ();

Neuvidíme spojenie s tabuľkou objednávok:

Hibernácia: vyberte ... od zákazníka, kde customer0_.id =? 

A to pre ďalší riadok:

Zákazník zákazník = customerRepository.findById (id) .get ();

Uvidíme ďalšie dotazy týkajúce sa súvisiacich objednávok:

Hibernácia: vyberte ... z objednávky, kde order0_.customer_id =? 

The Hibernácia FetchMode.SELECT pre každú vygeneruje samostatný dotaz objednať ktoré je potrebné načítať.

V našom príklade to dáva jeden dotaz na načítanie zákazníkov a päť ďalších dotazov na načítanie zbierky objednávok.

Toto je známe ako n + 1 vyberte problém. Spustenie jedného dotazu sa spustí n ďalšie otázky.

3.1. @BatchSize

FetchMode.SELECT má voliteľnú anotáciu konfigurácie pomocou @BatchSize anotácia:

@OneToMany @Fetch (FetchMode.SELECT) @BatchSize (veľkosť = 10) súkromné ​​Nastaviť objednávky;

Hibernácia sa pokúsi načítať zhromažďovanie objednávok v dávkach definovaných súborom veľkosť parameter.

V našom príklade máme iba päť objednávok, takže stačí jeden dopyt.

Stále budeme používať rovnaký dotaz:

Hibernácia: vyberte ... z objednávky, kde order0_.customer_id =?

Spustí sa však iba raz. Teraz máme len dva dotazy: Jeden na načítanie súboru Zákazník a jeden na načítanie zbierky objednávok.

4. FetchMode.JOIN

Zatiaľ čo FetchMode.SELECT lenivo načíta vzťahy, FetchMode.JOIN načíta ich nedočkavo, povedzme prostredníctvom spojenia:

@OneToMany @Fetch (FetchMode.JOIN) súkromné ​​nastavenie objednávok;

To má za následok iba jeden dopyt pre oba Zákazník a ich objednaťs:

Hibernácia: vyberte ... od zákazníka customer0_ zľava vonkajšie pripojenie order order1 na customer.id = order.customer_id kde customer.id =?

5. FetchMode.SUBSELECT

Pretože objednávky majetok je zbierka, ktorú by sme mohli aj použiť FetchMode.SUBSELECT:

@OneToMany @Fetch (FetchMode.SUBSELECT) súkromné ​​nastavenie objednávok;

Môžeme iba použiť VYBERTE so zbierkami.

S týmto nastavením sa vrátime k jednému dotazu na Zákazník:

Hibernácia: vyberte ... od zákazníka customer0_ 

A jeden dotaz pre objednaťs, tentokrát pomocou čiastkového výberu:

Hibernácia: vyberte ... z objednávky order0_ kde je objednávka0_.customer_id v (vyberte customer0_.id od zákazníka customer0_)

6. FetchMode vs. FetchType

Všeobecne, FetchMode definuje ako Hibernácia načíta údaje (výberom, pripojením alebo podvýberom). FetchType, na druhej strane definuje, či bude režim dlhodobého spánku načítavať údaje nedočkavo alebo lenivo.

Presné pravidlá medzi týmito dvoma pravidlami sú tieto:

  • ak sa kód nenastaví FetchMode, predvolená je PRIPOJTE SA a FetchType funguje ako je definované

  • s FetchMode.SELECT alebo FetchMode.SUBSELECT sada, FetchType funguje tiež podľa definície
  • s FetchMode.JOIN sada, FetchType je ignorovaný a dopyt je vždy horlivý

Ďalšie informácie nájdete v časti Nedočkavé / lenivé načítanie v režime dlhodobého spánku.

7. Záver

V tejto príručke sme sa dozvedeli niečo o FetchModeRôzne hodnoty a tiež to, ako s nimi súvisia FetchType.

Celý zdrojový kód je ako vždy k dispozícii na GitHub.


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