Proljetni podaci JPA i grafikoni imenovanih entiteta

1. Pregled

Jednostavno rečeno, grafikoni entiteta su još jedan način za opisivanje upita u JPA 2.1. Pomoću njih možemo formulirati upite s boljom izvedbom.

U ovom uputstvu naučit ćemo kako implementirati grafikone entiteta s Spring Data JPA kroz jednostavan primjer.

2. Entiteti

Prvo, izradimo model tzv Artikal koja ima više karakteristika:

@ Entitet javne klase Predmet {@Id private Long id; privatni naziv niza; @OneToMany (mappedBy = "item") karakteristike privatnog popisa = new ArrayList (); // geteri i postavljači}

Ajmo sada definirati Ckarakterističan entitet:

@ Entitet javna klasa Karakterističan {@ Id privatni Long id; tip privatnog niza; @ManyToOne (fetch = FetchType.LAZY) @JoinColumn private item; // Dobavljači i postavljači}

Kao što vidimo u kodu, i karakteristike polje u Artikal entitet i artikal polje u Karakteristična entitet se lijeno učitava pomoću donijeti parametar. Tako, naš je cilj ovdje željno ih učitati tijekom izvođenja.

3. Entitetski grafikoni

U Spring Data JPA možemo definirati grafikon entiteta pomoću a kombinacija od @NamedEntityGraph i @EntityGraph bilješke. Ili također možemo definirati ad-hoc grafikone entiteta samo pomoću attributePaths argument @EntityGraph bilješka.

Pogledajmo kako se to može učiniti.

3.1. S @NamedEntityGraph

Prvo, možemo koristiti JPA @NamedEntityGraph napomena izravno na našem Artikal entitet:

@Entity @NamedEntityGraph (name = "Item.characteristics", attributeNodes = @NamedAttributeNode ("karakteristike")) Predmet javne klase {// ...}

A onda, možemo priložiti @EntityGraph napomena za jednu od naših metoda spremišta:

javno sučelje ItemRepository proširuje JpaRepository {@EntityGraph (value = "Item.characteristics") Stavka findByName (naziv niza); }

Kao što kôd pokazuje, proslijedili smo ime grafikona entiteta, koje smo stvorili ranije na Artikal entitet, prema @EntityGraph bilješka. Kada pozovemo metodu, to će se koristiti upit Spring Data.

Zadana vrijednost argumenta tipa datoteke @EntityGraph napomena je EntityGraphType.FETCH. Kada ovo koristimo, modul Spring Data primijenit će FetchType.EAGER strategija na navedenim čvorovima atributa. A za druge, FetchType.LIJENO primijenit će se strategija.

Dakle, u našem slučaju, karakteristike svojstvo će se učitati željno, iako je zadana strategija dohvaćanja @OneToMany anotacija je lijena.

Ovdje je jedna kvaka ako je definirano donijeti strategija je ŽELJAN, tada njegovo ponašanje ne možemo promijeniti u LIJEN. To je prema dizajnu, budući da će kasnijim operacijama možda trebati nestrpljivo dohvaćeni podaci kasnije u toku izvođenja.

3.2. Bez @NamedEntityGraph

Ili možemo definirati i ad-hoc grafikon entiteta, s attributePaths.

Dodajmo ad-hoc grafikon entiteta u naš Spremište karakteristika koja nestrpljivo učitava svoje Artikal roditelj:

javno sučelje CharacteristicsRepository proširuje JpaRepository {@EntityGraph (attributePaths = {"item"}) Characteristic findByType (vrsta niza); }

Ovo će učitati artikal vlasništvo Karakteristična entitet željno, iako naš entitet izjavljuje strategiju lijenog učitavanja za ovo svojstvo.

To je zgodno jer grafik entiteta možemo definirati u redu umjesto da se pozivamo na postojeći imenovani grafikon entiteta.

4. Test slučaj

Sad kad smo definirali grafikone entiteta, kreirajmo test koji će ga provjeriti:

@DataJpaTest @RunWith (SpringRunner.class) @Sql (scripts = "/entitygraph-data.sql") javna klasa EntityGraphIntegrationTest {@Autowired private ItemRepository itemRepo; @Autowired private CharacteristicsRepository karakteristikeRepo; @Test javna praznina givenEntityGraph_whenCalled_shouldRetrunDefinedFields () {Item item = itemRepo.findByName ("Tablica"); assertThat (item.getId ()). isEqualTo (1L); } @Test javna praznina givenAdhocEntityGraph_whenCalled_shouldRetrunDefinedFields () {Karakteristična karakteristika = karakteristikeRepo.findByType ("Kruta"); assertThat (характеристика.getId ()). isEqualTo (1L); }}

Prvi test koristit će grafikon entiteta definiran pomoću @NamedEntityGraph bilješka.

Pogledajmo SQL koji je generirao Hibernate:

odaberite item0_.id kao id1_10_0_, characteri1_.id kao id1_4_1_, item0_.name kao name2_10_0_, characteri1_.item_id kao item_id3_4_1_, characteri1_.type kao type2_4_1_, characteri1_.item_id kao item_id3_4_0__, characteri1_.id kao id1_4_0__ iz točke item0_ lijevo vanjsko pridružiti karakterističan characteri1_ na item0_.id = karakteri1_.item_id gdje je item0_.name =?

Za usporedbu, uklonimo @EntityGraph napomena iz spremišta i pregledajte upit:

odaberite item0_.id kao id1_10_, item0_.name kao name2_10_ iz stavke item0_ gdje item0_.name =?

Iz ovih upita možemo jasno uočiti da je upit generiran bez @EntityGraph bilješka ne učitava nijedno svojstvo Karakteristična entitet. Kao rezultat, učitava samo Artikal entitet.

Na kraju, usporedimo Hibernate upite drugog testa s @EntityGraph napomena:

odaberite karakteri0_.id kao id1_4_0_, item1_.id kao id1_10_1_, character0_.item_id kao item_id3_4_0_, karakteri0_.tip kao type2_4_0_, item1_.name kao name2_10_1_ iz karakteristike karakteri0_ lijevo vanjsko spajanje stavke item1_ na characterid0 =.0em. =?

A upit bez @EntityGraph napomena:

odaberi karakteri0_.id kao id1_4_, karakteri0_.item_id kao item_id3_4_, karakteri0_.type kao type2_4_ iz karakteristike karakteri0_ gdje je karakteri0_.type =?

5. Zaključak

U ovom uputstvu naučili smo kako koristiti JPA grafikone entiteta u proljetnim podacima. Uz proljetne podatke, možemo stvoriti više metoda spremišta koje su povezane s različitim grafikonima entiteta.

Primjeri za ovaj članak dostupni su na GitHubu.


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