Kívánatos / lusta betöltés hibernált állapotban

Kitartás felső

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Bemutatkozás

ORM-mel való munkavégzés során az adatok lekérése / betöltése két típusba sorolható: lelkes és lusta.

Ebben a rövid cikkben rámutatunk a különbségekre, és megmutatjuk, hogy ezek miként használhatók a hibernált állapotban.

2. Maven-függőségek

A hibernálás használatához először határozzuk meg a fő függőséget pom.xml:

 org.hibernate hibernate-core 5.2.2.Végső 

A Hibernate legújabb verziója itt található.

3. Lelkes és lusta betöltés

Az első dolog, amit itt meg kell vitatnunk, mi a lusta rakodás és a lelkes rakodás:

  • Lelkesen töltődik olyan tervezési minta, amelyben az adatok inicializálása a helyszínen történik
  • Lusta betöltés egy tervezési minta, amely az objektum inicializálásának elhalasztására szolgál, ameddig csak lehetséges

Nézzük meg, hogyan működik ez valójában, néhány példával:

A UserLazy osztály:

@Entity @Table (name = "USER") nyilvános osztály A UserLazy a Serializable {@Id @GeneratedValue @Column (name = "USER_ID") privát Long userId; @OneToMany (fetch = FetchType.LAZY, mappedBy = "user") private Set orderDetail = new HashSet (); // standard beállítók és getterek // felülírják az egyenlőeket és a hashcode-ot is}

A OrderDetail osztály:

@Entity @Table (name = "USER_ORDER") public class A OrderDetail megvalósítja a Serializable {@Id @GeneratedValue @Column (name = "ORDER_ID") privát Long orderId; @ManyToOne (fetch = FetchType.LAZY) @JoinColumn (név = "USER_ID") privát UserLazy felhasználó; // szabványos beállítók és getterek // felülírják az egyenlőeket és a hashcode-ot is}

Egy Felhasználó lehet több OrderDetails. Lelkes rakodási stratégiában, ha betöltjük a Felhasználó adatokat, akkor az összes hozzá kapcsolódó megrendelést is feltölti, és egy memóriában tárolja.

De ha a lusta betöltés engedélyezve van, ha felhúzzuk a UserLazy, OrderDetail az adatok csak akkor kerülnek inicializálásra és betöltésre a memóriába, ha kifejezetten felhívják őket.

A következő részben megnézzük, hogy a fenti példa miként valósul meg Hibernate-ben.

4. Konfiguráció betöltése

Ebben a részben azt vizsgáljuk meg, hogyan konfigurálhatjuk a letöltési stratégiákat a hibernált állapotban. Újra felhasználjuk az előző szakasz példáit.

A Lazy Loading egyszerűen engedélyezhető a következő kommentár paraméterrel:

fetch = FetchType.LAZY

Az Eger Fetching használatához a következő paramétert kell használni:

fetch = FetchType.EAGER

Az Eger Loading beállításához használtuk UserLazyIkerosztálya hívott UserEager.

A következő részben megvizsgáljuk a kétféle lekérés közötti különbségeket.

5. Különbségek

Mint említettük, a kétféle lekérés közötti fő különbség az a pillanat, amikor az adatok betöltődnek a memóriába.

Vessünk egy pillantást erre a példára:

List users = sessionLazy.createQuery ("From UserLazy"). List (); UserLazy userLazyLoaded = users.get (3); return (userLazyLoaded.getOrderDetail ());

A lusta inicializálási megközelítéssel orderDetailSet csak akkor inicializálódik, ha kifejezetten egy getter vagy más módszer használatával hívják meg, a fenti példában látható módon:

UserLazy userLazyLoaded = users.get (3);

De lelkes hozzáállással UserEager azonnal inicializálásra kerül a fenti példa első sorában:

List user = sessionEager.createQuery ("From UserEager"). List ();

Lusta betöltéshez egy proxy objektumot használnak, és külön SQL lekérdezést indítanak a orderDetailSet .

A meghatalmazottak vagy a lusta betöltés letiltásának gondolata hibernált állapotban rossz gyakorlatnak számít. Ennek eredményeként rengeteg adatot lehet lekérni egy adatbázisból és tárolni a memóriában, függetlenül annak szükségességétől.

Az alábbi módszer használható a fenti funkcionalitás tesztelésére:

Hibernate.isInitialized (orderDetailSet);

Most fontos áttekinteni a mindkét esetben generált lekérdezéseket:

igaz

A fenti beállítás a fetching.hbm.xml a létrehozott SQL lekérdezéseket mutatja. Ha megnézi a konzol kimenetét, akkor láthatja a generált lekérdezéseket.

Lusta számára A. Betöltéséhez létrehozott lekérdezés betöltése Felhasználó adat:

válassza a user0_.USER_ID felhasználót USER_ID1_0_, ... a USER user0_ felhasználótól

A lelkes rakodás során azonban láttunk egy csatlakozást USER_ORDER:

válassza a orderdetai0_.USER_ID értéket USER_ID4_0_0_, a orderdetai0_.ORDER_ID értéket ORDER_ID1_1_0_, orderdetai0_ ... a USER_ORDER-től orderdetai0_ ahol orderdetai0_.USER_ID =?

A fenti lekérdezés mindenki számára generálódik Felhasználók, amelynek eredményeként sokkal több memória kerül felhasználásra, mint a másik megközelítésnél.

6. Előnyök és hátrányok

6.1. Lusta betöltés

Előnyök:

  • A kezdeti betöltési idő sokkal kisebb, mint a másik megközelítésnél
  • Kevesebb memóriafelhasználás, mint a másik megközelítésnél

Hátrányok:

  • A késleltetett inicializálás befolyásolhatja a teljesítményt nem kívánt pillanatok alatt
  • Bizonyos esetekben különös gonddal kell kezelnie a lustán inicializált tárgyakat, különben kivétel lehet

6.2. Szívesen töltődik:

Előnyök:

  • Nincs késleltetett inicializáláshoz kapcsolódó teljesítményhatás

Hátrányok:

  • Hosszú kezdeti betöltési idő
  • A túl sok felesleges adat betöltése befolyásolhatja a teljesítményt

7. Lusta betöltés hibernált állapotban

A hibernálás a lusta betöltési megközelítést alkalmazza az entitásokra és a társulásokra egy proxy megvalósítás biztosításával osztályokból.

A hibernált funkció az entitás hívásait úgy fogadja el, hogy az entitás osztályából származó proxyval helyettesíti. Példánkban, ha hiányzik egy kért információ, akkor azt egy adatbázisból betöltjük, mielőtt a vezérlő átengedne a Felhasználó osztály megvalósítása.

Azt is meg kell jegyezni, hogy amikor az egyesület gyűjteményosztályként van ábrázolva (a fenti példákban ez az Set orderDetailSet), akkor létrejön egy burkoló, és egy eredeti gyűjtemény helyettesíthető.

Ha többet szeretne megtudni a proxy tervezési mintázatáról, itt hivatkozhat.

8. Következtetés

Ebben a cikkben példákat mutattunk be a letöltés két fő típusára, amelyeket a hibernált állapotban használnak.

Haladó szintű szakértelemért tekintse meg a Hibernate hivatalos weboldalát. A cikkben tárgyalt kód megszerzéséhez kérjük, tekintse meg ezt a tárat.

Perzisztencia alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT