Jarné údaje JPA a grafy pomenovaných entít

1. Prehľad

Jednoducho povedané, Entity Graphs sú ďalším spôsobom, ako opísať dotaz v JPA 2.1. Pomocou nich môžeme formulovať dotazy s lepšou výkonnosťou.

V tomto výučbe sa na jednoduchom príklade naučíme implementovať Entity Graphs pomocou Spring Data JPA.

2. Subjekty

Najskôr si vytvorme model s názvom Položka ktorý má viac charakteristík:

@Entity public class Item {@Id private Long id; súkromné ​​meno reťazca; @OneToMany (mappedBy = "položka") súkromné ​​charakteristiky zoznamu = nový ArrayList (); // zakladatelia a zakladatelia}

Teraz definujme Ccharakteristický subjekt:

@Entity public class Charakteristika {@Id private Long id; súkromný typ reťazca; @ManyToOne (fetch = FetchType.LAZY) @JoinColumn súkromná položka položky; // Getters and Setters}

Ako vidíme v kóde, obidve charakteristiky pole v Položka subjekt a položka pole v Charakteristické entity sa lenivo načítajú pomocou aportovať parameter. Takže naším cieľom je tu ich načítať dychtivo za behu.

3. Grafy entít

V Spring Data JPA môžeme definovať entitný graf pomocou a kombinácia @NamedEntityGraph a @EntityGraph anotácie. Alebo môžeme tiež definovať ad-hoc grafy entít iba pomocou attributePaths argument @EntityGraph anotácia.

Pozrime sa, ako sa to dá urobiť.

3.1. S @NamedEntityGraph

Najprv môžeme použiť JPA @NamedEntityGraph anotáciu priamo na našu Položka subjekt:

@Entity @NamedEntityGraph (name = "Item.characteristics", attributeNodes = @NamedAttributeNode ("charakteristiky")) verejná trieda Položka {// ...}

A potom môžeme pripojiť @EntityGraph anotácia k jednej z našich metód úložiska:

verejné rozhranie ItemRepository rozširuje JpaRepository {@EntityGraph (hodnota = "Item.characteristics") položka findByName (názov reťazca); }

Ako ukazuje kód, odovzdali sme názov grafu entity, ktoré sme vytvorili predtým na serveri Položka subjekt, do @EntityGraph anotácia. Keď zavoláme metódu, bude to dopyt, ktorý použije Spring Data.

Predvolená hodnota argumentu typu parametra @EntityGraph anotácia je EntityGraphType.FETCH. Keď toto použijeme, modul Spring Data použije FetchType.EAGER stratégia na zadaných uzloch atribútov. A pre ostatných FetchType.LAZY stratégia.

Takže v našom prípade charakteristiky vlastnosť bude načítaná nedočkavo, aj keď je predvolená stratégia načítania súboru @OneToMany anotácia je lenivá.

Jeden háčik je tu ak je definované aportovať stratégia je EAGER, potom nemôžeme zmeniť jeho správanie na LENIVÝ. Toto je zámerné, pretože nasledujúce operácie môžu vyžadovať dychtivo načítané dáta neskôr v priebehu vykonávania.

3.2. Bez @NamedEntityGraph

Alebo môžeme definovať aj entitový graf entít, s attributePaths.

Pridajme k nám entitový graf ad-hoc CharakteristikaÚložisko že nedočkavo načíta svoje Položka rodič:

verejné rozhranie CharacteristicsRepository extends JpaRepository {@EntityGraph (attributePaths = {"item"}) Characteristic findByType (String type); }

Týmto sa načíta položka majetok Charakteristické entita nedočkavo, aj keď naša entita deklaruje pre túto vlastnosť stratégiu lenivého načítania.

Je to užitočné, pretože môžeme definovať entitový graf inline namiesto toho, aby sme odkazovali na existujúci pomenovaný entitný graf.

4. Testovací prípad

Teraz, keď sme definovali naše grafy entít, vytvorme testovací prípad na jeho overenie:

@DataJpaTest @RunWith (SpringRunner.class) @Sql (scripts = "/entitygraph-data.sql") verejná trieda EntityGraphIntegrationTest {@Autowired private ItemRepository itemRepo; @Autowired private CharacteristicsRepository characteristicsRepo; @Test public void givenEntityGraph_whenCalled_shouldRetrunDefinedFields () {Item item = itemRepo.findByName ("tabuľka"); assertThat (item.getId ()). isEqualTo (1L); } @Test public void givenAdhocEntityGraph_whenCalled_shouldRetrunDefinedFields () {charakteristická charakteristika = charakteristikaRepo.findByType ("tuhá"); assertThat (charakteristika.getId ()). isEqualTo (1L); }}

Prvý test použije entitový graf definovaný pomocou @NamedEntityGraph anotácia.

Pozrime sa na SQL vygenerovaný režimom dlhodobého spánku:

vyberte item0_.id ako id1_10_0_, characteri1_.id ako id1_4_1_, item0_.name ako name2_10_0_, characteri1_.item_id ako item_id3_4_1_, characteri1_.type ako typ2_4_1_, characteri1_.item_id ako item_id3_4_0_0_ na item0_.id = characteri1_.item_id kde item0_.name =?

Pre porovnanie, odstráňte @EntityGraph anotáciu z úložiska a skontrolujte dotaz:

vyberte item0_.id ako id1_10_, item0_.name ako name2_10_ z položky item0_ kde item0_.name =?

Z týchto dotazov môžeme jasne pozorovať, že dopyt sa generoval bez @EntityGraph anotácia nenačítava žiadne vlastnosti Charakteristické subjekt. Vo výsledku načíta iba Položka subjekt.

Na záver porovnáme dotazy týkajúce sa režimu dlhodobého spánku druhého testu s @EntityGraph anotácia:

vyberte characteri0_.id ako id1_4_0_, item1_.id ako id1_10_1_, characteri0_.item_id ako item_id3_4_0_, characteri0_.type ako typ2_4_0_, item1_.name ako name2_10_1_ z charakteristického characteri0_ ľavý vonkajší spoj položky item1_ na characteri0_it1 =?

A dopyt bez @EntityGraph anotácia:

vyberte Characteri0_.id ako id1_4_, Characteri0_.item_id ako item_id3_4_, Characteri0_.type ako Type2_4_ z charakteristického Characteri0_ kde Characteri0_.type =?

5. Záver

V tomto tutoriáli sme sa naučili, ako používať grafy entít JPA v jarných dátach. S údajmi z jari môžeme vytvoriť viac metód úložiska, ktoré sú prepojené s rôznymi grafmi entít.

Príklady tohto článku sú k dispozícii na GitHub.


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