Spring Data JPA og Named Entity Grafer

1. Oversikt

Enkelt sagt, enhetsgrafer er en annen måte å beskrive et spørsmål i JPA 2.1 på. Vi kan bruke dem til å formulere spørsmål som gir bedre resultater.

I denne opplæringen skal vi lære å implementere enhetsgrafer med Spring Data JPA gjennom et enkelt eksempel.

2. Enhetene

La oss først lage en modell som heter Punkt som har flere egenskaper:

@Entity public class Element {@Id privat Lang id; privat strengnavn; @OneToMany (mappedBy = "item") private Listeegenskaper = ny ArrayList (); // getters og setters}

La oss nå definere Charakteristisk enhet:

@Entity offentlig klasse Karakteristisk {@Id privat Lang id; privat streng type; @ManyToOne (fetch = FetchType.LAZY) @JoinColumn private Item item; // Getters og Setters}

Som vi kan se i koden, både kjennetegn felt i Punkt enhet og punkt felt i Karakteristisk enheten lastes lat ved hjelp av hente parameter. Så, vårt mål her er å laste dem ivrig ved kjøretid.

3. Enhetsgrafene

I Spring Data JPA kan vi definere en enhetsgraf ved hjelp av a kombinasjon av @NamedEntityGraph og @EntityGraph kommentarer. Eller vi kan også definere ad-hoc-enhetsgrafer med bare attributt Stier argument av @EntityGraph kommentar.

La oss se hvordan det kan gjøres.

3.1. Med @NamedEntityGraph

Først kan vi bruke JPA-er @NamedEntityGraph kommentar direkte på vår Punkt enhet:

@Entity @NamedEntityGraph (name = "Item.characteristics", attributeNodes = @NamedAttributeNode ("features")) offentlig klasse Element {// ...}

Og så kan vi feste @EntityGraph kommentar til en av våre depotmetoder:

offentlig grensesnitt ItemRepository utvider JpaRepository {@EntityGraph (value = "Item.characteristics") Item findByName (strengnavn); }

Som koden viser, har vi passert navnet på enhetsgrafen, som vi har opprettet tidligere på Punkt enhet, til @EntityGraph kommentar. Når vi kaller metoden, er det spørringen Spring Data vil bruke.

Standardverdien for typeargumentet til @EntityGraph kommentar er EntityGraphType.FETCH. Når vi bruker dette, vil Spring Data-modulen bruke FetchType.EAGER strategi på de angitte attributtknutepunktene. Og for andre, den FetchType.LAZY strategi vil bli brukt.

Så i vårt tilfelle, kjennetegn eiendommen lastes ivrig, selv om standard hentestrategi for @OneToMany kommentar er lat.

En fangst her er at hvis det er definert hente strategi er IVRIG, da kan vi ikke endre oppførselen til LAT. Dette er av design siden de påfølgende operasjonene kan trenge de ivrig hentede dataene på et senere tidspunkt under utførelsen.

3.2. Uten @NamedEntityGraph

Eller vi kan også definere en ad-hoc-enhetsgraf, med attributt Stier.

La oss legge til en ad-hoc-enhetsgraf til vår Egenskaper Oppbevaringssted som ivrig laster sin Punkt foreldre:

offentlig grensesnitt CharacteristicsRepository utvider JpaRepository {@EntityGraph (attributePaths = {"item"}) Karakteristisk findByType (strengtype); }

Dette vil laste punkt eiendommen til Karakteristisk enhet ivrig, selv om virksomheten vår erklærer en lazy-loading-strategi for denne eiendommen.

Dette er praktisk siden vi kan definere enhetsgrafen innebygd i stedet for å referere til en eksisterende navngitt enhetsgraf.

4. Prøvesak

Nå som vi har definert enhetsgrafene, la oss lage en testtilfelle for å bekrefte det:

@DataJpaTest @RunWith (SpringRunner.class) @Sql (scripts = "/entitygraph-data.sql") public class EntityGraphIntegrationTest {@Autowired private ItemRepository itemRepo; @Autowired private CharacteristicsRepository featuresRepo; @Test offentlig ugyldig givenEntityGraph_whenCalled_shouldRetrunDefinedFields () {Item item = itemRepo.findByName ("Table"); assertThat (item.getId ()). erEqualTo (1L); } @Test offentlig tomrom gittAdhocEntityGraph_whenCalled_shouldRetrunDefinedFields () {Karakteristisk karakteristikk = egenskaperRepo.findByType ("Stiv"); assertThat (karakteristisk.getId ()). erEqualTo (1L); }}

Den første testen bruker enhetsgrafen som er definert ved hjelp av @NamedEntityGraph kommentar.

La oss se SQL generert av dvalemodus:

velg element0_.id som id1_10_0_, characteri1_.id som id1_4_1_, item0_.name som navn2_10_0_, characteri1_.item_id som item_id3_4_1_, characteri1_.type som type2_4_1_, characteri1_.item_id som item_id3_4_0__, på item0_.id = characteri1_.item_id hvor item0_.name =?

Til sammenligning, la oss fjerne @EntityGraph kommentar fra depotet og inspiser spørringen:

velg item0_.id som id1_10_, item0_.name som name2_10_ fra item item0_ hvor item0_.name =?

Fra disse spørsmålene kan vi tydelig observere at spørringen generert uten @EntityGraph kommentar laster ikke inn noen egenskaper av Karakteristisk enhet. Som et resultat laster den bare Punkt enhet.

Til slutt, la oss sammenligne dvalemodus-spørringene til den andre testen med @EntityGraph kommentar:

velg characteri0_.id som id1_4_0_, item1_.id som id1_10_1_, characteri0_.item_id som item_id3_4_0_, characteri0_.type som type2_4_0_, item1_.name som name2_10_1_ fra karakteristisk characteri0_ venstre ytre sammenføye item item1_ på characteri0_it. =?

Og spørringen uten @EntityGraph kommentar:

velg characteri0_.id som id1_4_, characteri0_.item_id som item_id3_4_, characteri0_.type som type2_4_ fra karakteristisk characteri0_ hvor characteri0_.type =?

5. Konklusjon

I denne veiledningen har vi lært hvordan du bruker JPA Entity Grafer i vårdata. Med vårdata, vi kan opprette flere depotmetoder som er knyttet til forskjellige enhetsgrafer.

Eksemplene for denne artikkelen er tilgjengelig på GitHub.


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