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.


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