Metóda proxy v režime dlhodobého spánku ()

1. Prehľad

V tomto návode uvidíme, čo je proxy server v kontexte režimu dlhodobého spánku naložiť() metóda.

U čitateľov, ktorí v Hibernate začínajú, zvážte najskôr zoznámenie sa so základmi.

2. Stručný úvod do Proxy a naložiť() Metóda

Podľa definície je splnomocnenec „funkcia oprávnená konať ako zástupca alebo náhrada za iného“.

To platí pre režim dlhodobého spánku, keď voláme Session.load () vytvoriť niečo, čo sa nazýva neinicializovaný proxy server našej požadovanej triedy entít.

Jednoducho povedané, režim dlhodobého spánku podtriedy našu triedu entít, pomocou CGLib knižnica. Iné ako @Id metóda, implementácia proxy deleguje všetky ostatné metódy vlastností na reláciu Hibernate na vyplnenie inštancie, podobne ako:

verejná trieda HibernateProxy rozširuje MyEntity {súkromný cieľ MyEntity; public String getFirstName () {if (target == null) {target = readFromDatabase (); } návrat target.getFirstName (); }}

Táto podtrieda bude tou, ktorá sa vráti namiesto priameho dotazovania v databáze.

Po zavolaní jednej z metód entity sa entita načíta a v tom okamihu sa zmení na inicializovaný proxy server.

3. Proxy a leniví načítava

3.1. Jeden subjekt

Zamyslime sa Zamestnanec ako jednotka. Na začiatok predpokladáme, že nemá žiadny vzťah k iným tabuľkám.

Ak použijeme Session.load () vytvoriť inštanciu Zamestnanec:

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

Potom režim dlhodobého spánku vytvorí neinicializovaný proxy server Zamestnanec. Bude obsahovať ID, ktoré sme mu dali, ale inak nebude mať žiadne ďalšie hodnoty, pretože sme do databázy ešte nenarazili.

Akonáhle však zavoláme metódu ďalej Albert:

Reťazec firstName = albert.getFirstName ();

Potom Hibernácia vyhľadá zamestnanec databázová tabuľka pre entitu s primárnym kľúčom 1, ktorá sa naplní Albert s jeho vlastnosťami z príslušného riadku.

Ak sa jej nepodarí nájsť riadok, potom režim dlhodobého spánku hodí ObjectNotFoundException.

3.2. Vzťahy typu one-to-many

Teraz vytvorme a Spoločnosť tiež subjekt, kde a Spoločnosť má mnoho Zamestnanci:

public class Company {private String name; zamestnanci súkromnej súpravy; }

Ak tentokrát použijeme Session.load () o spoločnosti:

Spoločnosť bizco = session.load (Company.class, nová Long (1)); Názov reťazca = bizco.getName ();

Potom sa vlastnosti spoločnosti zaplnia tak ako predtým, ibaže skupina zamestnancov je len trochu iná.

Vidíte, dopytovali sme sa iba pre riadok spoločnosti, ale proxy ponechá zamestnanca nastaveného na pokoji, kým nezavoláme getEmployee v závislosti od stratégie načítania.

3.3. Vzťahy typu „všetko v jednom“

Prípad je podobný v opačnom smere:

verejná trieda Zamestnanec {private String meno; súkromné ​​firemné pracovisko; }

Ak použijeme naložiť() ešte raz:

Bob zamestnanca = session.load (Employee.class, new Long (2)); Reťazec firstName = bob.getFirstName ();

bob sa teraz inicializuje a vlastne pracovisku bude teraz nastavený ako neinicializovaný server proxy v závislosti od stratégie načítania.

4. Lenivé načítanie

Teraz, naložiť() nie vždy nám dá neinicializovaný proxy server. V skutočnosti Session java doc nám pripomína (zvýraznenie doplnené):

Táto metóda možno vráti proxy inštanciu, ktorá sa inicializuje na požiadanie, keď sa použije metóda neidentifikátora.

Jednoduchý príklad toho, kedy sa to môže stať, je veľkosť dávky.

Povedzme, že používame @BatchSize na našom Zamestnanec subjekt:

Zamestnanec triedy @Entity @BatchSize (veľkosť = 5) {// ...}

A tentoraz máme troch zamestnancov:

Employee catherine = session.load (Employee.class, new Long (3)); Employee darrell = session.load (Employee.class, new Long (4)); Zamestnanec emma = session.load (Employee.class, new Long (5));

Ak zavoláme getFirstName na catherine:

Reťazec cathy = catherine.getFirstName ();

Potom sa v skutočnosti môže spoločnosť Hibernate rozhodnúť načítať všetkých troch zamestnancov naraz a všetkých troch zmeniť na inicializovaných zástupcov.

A potom, keď požadujeme darrellKrstné meno:

Reťazec darrell = darrell.getFirstName ();

Potom Hibernácia sa vôbec nedostala do databázy.

5. Nedočkavé načítanie

5.1. Použitím dostať ()

Môžeme tiež úplne obísť proxy a požiadať Hibernate, aby načítal skutočnú vec pomocou Session.get ():

Employee finnigan = session.get (Employee.class, new Long (6));

Toto okamžite zavolá databázu namiesto vrátenia proxy.

A vlastne namiesto ObjectNotFoundException, vráti sa nulový ak finnigan neexistuje.

5.2. Dôsledky na výkon

Zatiaľ čo dostať () je to pohodlné, naložiť() môže byť v databáze ľahší.

Napríklad, povedzme Gerald bude pracovať pre novú spoločnosť:

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

Pretože vieme, že zmeníme iba server zamestnanec záznam v tejto situácii, volanie naložiť() pre Spoločnosť je rozumné.

Keby sme volali dostať () na Spoločnosť, potom by sme zbytočne načítali všetky jej údaje z databázy.

6. Záver

V tomto článku sme sa stručne dozvedeli ako Hibernácia servery proxy fungujú a aký to má vplyv na server naložiť metóda s entitami a ich vzťahmi.

Tiež sme sa rýchlo pozreli na to, ako na to naložiť() sa líši od získať ().

Celý zdrojový kód, ktorý je sprievodcom výukovým programom, je ako obvykle k dispozícii na GitHub.