FetchMode i dvale

1. Introduktion

I denne korte vejledning ser vi på forskellige FetchMode værdier, vi kan bruge i @org.hibernate.annotations.Fetch kommentar.

2. Opsætning af eksemplet

Som et eksempel bruger vi følgende Kunde enhed med kun to egenskaber - et id og et sæt ordrer:

@Entity offentlig klasse kunde {@Id @GeneratedValue privat Lang id; @OneToMany (mappedBy = "kunde") @Fetch (værdi = FetchMode.SELECT) privat Sæt ordrer = nyt HashSet (); // getters og setters}

Vi opretter også en Bestille enhed bestående af et id, et navn og en henvisning til Kunde.

@Entity offentlig klasse Bestil {@Id @GeneratedValue privat Lang id; privat strengnavn; @ManyToOne @JoinColumn (name = "customer_id") privat kundekunde; // getters og setters}

I hvert af de næste sektioner henter vi kunden fra databasen og får alle dens ordrer:

Kundekunde = customerRepository.findById (id) .get (); Sæt ordrer = customer.getOrders ();

3. FetchMode.SELECT

På vores Kunde enhed, vi har kommenteret Ordre:% s ejendom med en @Fetch kommentar:

@OneToMany @Fetch (FetchMode.SELECT) private sæt ordrer;

Vi bruger @Fetch for at beskrive, hvordan dvale skal hente ejendommen, når vi slår op a Kunde.

Ved brug af VÆLG angiver, at ejendommen skal indlæses dovent.

Dette betyder, at for første linje:

Kundekunde = customerRepository.findById (id) .get ();

Vi ser ikke en sammenføjning med ordretabellen:

Dvaletilstand: vælg ... fra kunde hvor kunde0_.id =? 

Og det til næste linje:

Kundekunde = customerRepository.findById (id) .get ();

Vi ser efterfølgende forespørgsler for de relaterede ordrer:

Dvaletilstand: vælg ... fra rækkefølge, hvor order0_.customer_id =? 

Det Dvaletilstand FetchMode.SELECT genererer en separat forespørgsel for hver Bestille der skal indlæses.

I vores eksempel giver det en forespørgsel til at indlæse kunderne og yderligere fem forespørgsler for at indlæse ordresamlingen.

Dette er kendt som n + 1 vælg problem. Udførelse af en forespørgsel udløses n yderligere forespørgsler.

3.1. @BatchSize

FetchMode.SELECT har en valgfri konfigurationsnotering ved hjælp af @BatchSize kommentar:

@OneToMany @Fetch (FetchMode.SELECT) @BatchSize (størrelse = 10) private Sæt ordrer;

Dvale vil forsøge at indlæse ordresamlingen i batcher defineret af størrelse parameter.

I vores eksempel har vi kun fem ordrer, så en forespørgsel er nok.

Vi bruger stadig den samme forespørgsel:

Dvaletilstand: vælg ... fra rækkefølge, hvor order0_.customer_id =?

Men den køres kun én gang. Nu har vi kun to forespørgsler: En til at indlæse Kunde og en til at indlæse ordrer.

4. FetchMode.JOIN

Mens FetchMode.SELECT indlæser forhold dovent, FetchMode.JOIN indlæser dem ivrigt, sig via en join:

@OneToMany @Fetch (FetchMode.JOIN) private sæt ordrer;

Dette resulterer i kun en forespørgsel for begge Kunde og deres Bestilles:

Dvaletilstand: vælg ... fra kundekunde0_ venstre ydre tilslutningsordre1 på customer.id = order.customer_id hvor customer.id =?

5. FetchMode.SUBSELECT

Fordi Ordre:% s ejendom er en samling, vi også kunne bruge FetchMode.SUBSELECT:

@OneToMany @Fetch (FetchMode.SUBSELECT) private sæt ordrer;

Vi kan kun bruge SUBSELECT med samlinger.

Med denne opsætning vender vi tilbage til en forespørgsel til Kunde:

Dvaletilstand: vælg ... fra kundekunde0_ 

Og en forespørgsel til Bestilles, ved hjælp af en undervalg denne gang:

Dvaletilstand: vælg ... fra ordreordre0_ hvor ordre0_.kunde_id i (vælg kunde0_.id fra kundekunde0_)

6. FetchMode vs. FetchType

Generelt, FetchMode definerer hvordan Dvale vil hente dataene (ved at vælge, deltage eller vælge undertegn). FetchTypedefinerer derimod, om dvale vil indlæse data ivrigt eller dovent.

De nøjagtige regler mellem disse to er som følger:

  • hvis koden ikke er indstillet FetchMode, standard er TILSLUTTE og FetchType fungerer som defineret

  • med FetchMode.SELECT eller FetchMode.SUBSELECT sæt, FetchType fungerer også som defineret
  • med FetchMode.JOIN sæt, FetchType ignoreres, og en forespørgsel er altid ivrig

For yderligere information henvises til Eager / Lazy Loading In Dvaletilstand.

7. Konklusion

I denne vejledning har vi lært om FetchMode'S forskellige værdier og også hvordan de er relateret til FetchType.

Som altid er al kildekode tilgængelig på GitHub.