FetchMode i dvale
1. Introduksjon
I denne korte opplæringen vil vi se på forskjellige FetchMode verdier vi kan bruke i @org.hibernate.annotations.Fetch kommentar.
2. Sette opp eksemplet
Som et eksempel bruker vi følgende Kunde enhet med bare to egenskaper - en id og et sett med ordrer:
@Entity offentlig klasse kunde {@Id @GeneratedValue privat Lang id; @OneToMany (mappedBy = "kunde") @Fetch (verdi = FetchMode.SELECT) private Sett ordrer = ny HashSet (); // getters og setters}
Vi oppretter også en Rekkefølge enhet bestående av en id, et navn og en referanse til Kunde.
@Entity offentlig klasse Bestill {@Id @GeneratedValue private Lang id; privat strengnavn; @ManyToOne @JoinColumn (name = "customer_id") privat kundekunde; // getters og setters}
I hver av de neste seksjonene henter vi kunden fra databasen og får alle bestillingene:
Kundekunde = customerRepository.findById (id) .get (); Angi bestillinger = customer.getOrders ();
3. FetchMode.SELECT
På vår Kunde enhet, har vi kommentert ordrene eiendom med en @Fetch kommentar:
@OneToMany @Fetch (FetchMode.SELECT) private Sett bestillinger;
Vi bruker @Fetch for å beskrive hvordan dvalemodus skal hente eiendommen når vi slår opp a Kunde.
Ved hjelp av Å VELGE indikerer at eiendommen skal lastes lat.
Dette betyr at for første linje:
Kundekunde = customerRepository.findById (id) .get ();
Vi ser ikke en sammenføyning med ordretabellen:
Dvalemodus: velg ... fra kunde hvor kunde0_.id =?
Og det for neste linje:
Kundekunde = customerRepository.findById (id) .get ();
Vi ser påfølgende spørsmål for de relaterte ordrene:
Dvalemodus: velg ... fra bestilling hvor order0_.customer_id =?
De Dvalemodus FetchMode.SELECT genererer et eget spørsmål for hver Rekkefølge som må lastes.
I vårt eksempel gir det ett spørsmål om å laste inn kundene og fem ekstra spørsmål for å laste inn ordresamlingen.
Dette er kjent som n + 1 velg problem. Å utføre en spørring vil utløse n flere spørsmål.
3.1. @Partistørrelse, Gruppestørrelse
FetchMode.SELECT har en valgfri konfigurasjonsmerknad ved hjelp av @Partistørrelse, Gruppestørrelse kommentar:
@OneToMany @Fetch (FetchMode.SELECT) @BatchSize (størrelse = 10) private Sett ordrer;
Dvalemodus vil prøve å laste ordresamlingen i grupper definert av størrelse parameter.
I vårt eksempel har vi bare fem bestillinger, så en spørring er nok.
Vi bruker fortsatt den samme spørringen:
Dvalemodus: velg ... fra bestilling hvor order0_.customer_id =?
Men den vil bare kjøres en gang. Nå har vi bare to spørsmål: En å laste inn Kunde og en for å laste inn bestillingen.
4. FetchMode.JOIN
Samtidig som FetchMode.SELECT laster relasjoner lat, FetchMode.JOIN laster dem ivrig, si via en join:
@OneToMany @Fetch (FetchMode.JOIN) private Sett bestillinger;
Dette resulterer i bare ett spørsmål for begge Kunde og deres Rekkefølges:
Dvalemodus: velg ... fra kundekunde0_ venstre ytre bli ordreordre1 på customer.id = order.customer_id hvor customer.id =?
5. FetchMode.SUBSELECT
Fordi det ordrene eiendommen er en samling, vi kan også bruke FetchMode.SUBSELECT:
@OneToMany @Fetch (FetchMode.SUBSELECT) private Sett ordrer;
Vi kan bare bruke SUBSELECT med samlinger.
Med dette oppsettet går vi tilbake til ett spørsmål for Kunde:
Dvalemodus: velg ... fra kundekunde0_
Og ett spørsmål til Rekkefølges, ved å bruke et undervalg denne gangen:
Dvalemodus: velg ... fra ordreordre0_ hvor ordre0_.kunde_id i (velg kunde0_.id fra kundekunde0_)
6. FetchMode vs. FetchType
Generelt, FetchMode definerer hvordan Dvalemodus vil hente dataene (ved å velge, bli med eller velge under). FetchTypederimot, definerer om dvalemodus vil laste inn data ivrig eller lat.
De nøyaktige reglene mellom disse to er som følger:
- hvis koden ikke er satt FetchMode, standard er BLI MED og FetchType fungerer som definert
- med FetchMode.SELECT eller FetchMode.SUBSELECT sett, FetchType fungerer også som definert
- med FetchMode.JOIN sett, FetchType blir ignorert og et spørsmål er alltid ivrig
For ytterligere informasjon, se Eager / Lazy Loading in Hibernate.
7. Konklusjon
I denne veiledningen har vi lært om FetchMode‘S forskjellige verdier og også hvordan de er relatert til FetchType.
Som alltid er all kildekode tilgjengelig på GitHub.