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.