Proxy i dvalemodus () Metode

1. Oversikt

I denne opplæringen ser vi hva en proxy er i sammenheng med dvalemodus laste() metode.

For lesere som ikke er i dvale, bør du først bli kjent med det grunnleggende.

2. En kort introduksjon til fullmakter og laste() Metode

Per definisjon er en fullmektig “en funksjon autorisert til å fungere som stedfortreder eller erstatning for en annen”.

Dette gjelder dvalemodus når vi ringer Session.load () å skape det som kalles en uinitialisert proxy av ønsket enhetsklasse.

Enkelt sagt, Hibernate underklasser vår enhetsklasse ved hjelp av CGLib bibliotek. Annet enn @Id metode delegerer proxy-implementeringen alle andre eiendomsmetoder til dvalemodus-økten for å fylle forekomsten, noe som:

offentlig klasse HibernateProxy utvider MyEntity {private MyEntity target; offentlig streng getFirstName () {if (target == null) {target = readFromDatabase (); } returner target.getFirstName (); }}

Denne underklassen vil være den som skal returneres i stedet for å spørre databasen direkte.

Når en av enhetsmetodene er kalt, blir enheten lastet og blir på det tidspunktet en initialisert proxy.

3. Fullmakter og lat lasting

3.1. En enkelt enhet

La oss tenke på Ansatt som en enhet. Til å begynne med antar vi at det ikke har noen sammenheng med andre tabeller.

Hvis vi bruker Session.load () å instansiere en Ansatt:

Medarbeider albert = session.load (Employee.class, new Long (1));

Da vil dvalemodus opprette en ikke-initialisert proxy for Ansatt. Den vil inneholde ID-en som vi ga den, men ellers vil den ikke ha andre verdier fordi vi ikke har kommet til databasen ennå.

Imidlertid, når vi kaller en metode på Albert:

Streng fornavn = albert.getFirstName ();

Da vil dvalemodus spørre ansatt databasetabell for en enhet med en primærnøkkel på 1, fylt ut Albert med sine eiendommer fra tilsvarende rad.

Hvis den ikke finner en rad, kaster dvalemodus en ObjectNotFoundException.

3.2. En-til-mange forhold

La oss nå lage en Selskap enhet også, der en Selskap har mange Ansatte:

offentlig klasse Company {private strengnavn; private Set ansatte; }

Hvis vi denne gangen bruker Session.load () på selskapet:

Company bizco = session.load (Company.class, new Long (1)); Strengnavn = bizco.getName ();

Da er selskapets eiendommer befolket som før, bortsett fra at settet med ansatte er litt annerledes.

Se, vi spurte bare om selskapsserien, men fullmektigen lar den ansatte være alene til vi ringer getAnsatte avhengig av hentestrategien.

3.3. Mange-til-en-forhold

Saken er lik i motsatt retning:

offentlig klasse Ansatt {privat streng fornavn; privat bedrift arbeidsplass; }

Hvis vi bruker laste() en gang til:

Ansatt bob = session.load (ansatt.klasse, ny lang (2)); Streng fornavn = bob.getFirstName ();

bob vil nå bli initialisert, og faktisk, arbeidsplass vil nå bli satt til å være en ikke-initialisert proxy, avhengig av hentingsstrategien.

4. Lazy-ish Loading

Nå, laste() vil ikke alltid gi oss en ikke-initialisert proxy. Faktisk, den Økt java doc minner oss om (vektlegging lagt til):

Denne metoden kanskje returnere en nærliggende forekomst som initialiseres på forespørsel når en ikke-identifiserende metode er tilgjengelig.

Et enkelt eksempel på når dette kan skje er med batchstørrelse.

La oss si at vi bruker @Partistørrelse, Gruppestørrelse på vår Ansatt enhet:

@Entity @BatchSize (størrelse = 5) klasse Ansatt {// ...}

Og denne gangen har vi tre ansatte:

Medarbeider catherine = session.load (Employee.class, new Long (3)); Ansatt darrell = session.load (ansatt.klasse, ny lang (4)); Employee emma = session.load (Employee.class, new Long (5));

Hvis vi ringer getFirstName catherine:

String cathy = catherine.getFirstName ();

Så, faktisk, kan dvalemodus bestemme seg for å laste alle de tre ansatte samtidig, og gjøre alle tre til initialiserte fullmakter.

Og så når vi etterlyser darrellFornavn:

String darrell = darrell.getFirstName ();

Deretter Dvalemodus treffer ikke databasen i det hele tatt.

5. Ivrig lasting

5.1. Ved hjelp av få()

Vi kan også omgå fullmakter fullstendig og be dvalemodus om å laste inn den virkelige tingen ved hjelp av Session.get ():

Medarbeider finnigan = session.get (Medarbeiderklasse, ny Lang (6));

Dette vil ringe databasen med en gang, i stedet for å returnere en proxy.

Og faktisk, i stedet for en ObjectNotFoundException, kommer den tilbake null hvis finnigan eksisterer ikke.

5.2. Ytelsesimplikasjoner

Samtidig som få() er praktisk, laste() kan være lettere på databasen.

La oss for eksempel si gerald skal jobbe for et nytt selskap:

Ansatt gerald = session.get (Employee.class, new Long (7)); Company worldco = (Company) session.load (Company.class, new Long (2)); ansatt.setCompany (worldco); session.save (ansatt);

Siden vi vet at vi bare skal endre ansatt registrere i denne situasjonen, ringer laste() til Selskap er fornuftig.

Hvis vi ringte få()Selskap, så hadde vi lastet alle dataene i unødvendig grad fra databasen.

6. Konklusjon

I denne artikkelen lærte vi kort hvordan Dvalemodus fullmakter fungerer og hvordan dette påvirker laste metode med enheter og deres forhold.

Vi tok også en rask titt på hvordan laste() skiller seg fra få().

Som vanlig er den fullstendige kildekoden som følger med opplæringen tilgjengelig på GitHub.


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