Spring Data JPA és elnevezett entitások grafikonjai

1. Áttekintés

Egyszerűen fogalmazva: az Entity Graphs egy másik módszer a lekérdezés leírására a JPA 2.1-ben. Használhatjuk őket jobban teljesítő lekérdezések megfogalmazására.

Ebben az oktatóanyagban egy egyszerű példán keresztül megtanuljuk, hogyan kell megvalósítani az Entity Graph-okat a Spring Data JPA-val.

2. Az entitások

Először hozzunk létre egy nevű modellt Tétel amelynek több jellemzője van:

@Entity public class Item {@Id private Long id; privát karakterlánc neve; @OneToMany (mappedBy = "item") privát Lista jellemzői = new ArrayList (); // szerelők és beállítók}

Most definiáljuk a C-tjellegzetes entitás:

@Entity public class Characteristic {@Id private Long id; privát String típus; @ManyToOne (fetch = FetchType.LAZY) @JoinColumn privát elem; // Getters and Setters}

Mint a kódban láthatjuk, mind a jellemzők mező a Tétel entitás és a tétel mező a Jellegzetes entitást lustán töltjük be a elhozni paraméter. Így, itt az a célunk, hogy futás közben lelkesen töltsük be őket.

3. Az entitásgrafikonok

A Spring Data JPA-ban meghatározhatunk egy entitásdiagramot a használatával kombinációja @NévEntityGraph és @EntityGraph annotációk. Vagy ad-hoc entitásdiagramokat is definiálhatunk csak a attributePaths érvelése @EntityGraph annotáció.

Lássuk, hogyan lehet ezt megtenni.

3.1. Val vel @NévEntityGraph

Először is használhatjuk a JPA-kat @NévEntityGraph annotáció közvetlenül a mi Tétel entitás:

@Entity @NamedEntityGraph (name = "Item.characteristics", attributeNodes = @NévAttributeNode ("features")) public class Item {// ...}

És akkor csatolhatjuk a @EntityGraph kommentár az egyik tároló módszerünkhöz:

nyilvános felület Az ItemRepository kiterjeszti a JpaRepository {@EntityGraph (value = "Item.characteristics") elem findByName (karakterlánc neve); }

Amint a kód mutatja, átadtuk az entitásdiagram nevét, amelyet korábban a Tétel entitás, hoz @EntityGraph annotáció. Amikor meghívjuk a módszert, akkor ezt a lekérdezést fogja használni a Spring Data.

A. Típusú argumentum alapértelmezett értéke @EntityGraph az annotáció az EntityGraphType.FETCH. Amikor ezt használjuk, a Spring Data modul a FetchType.EAGER stratégia a megadott attribútum csomópontokon. És mások számára a FetchType.LAZY stratégiát alkalmazzák.

Tehát esetünkben a jellemzők tulajdonság lelkesen töltődik be, annak ellenére, hogy a @Egy a sokhoz az annotáció lusta.

Itt egy fogás az ha a meghatározott elhozni stratégia az MOHÓ, akkor nem változtathatjuk a viselkedését LUSTA. Ez terv szerint van, mivel a későbbi műveletek során szükség lehet a lelkesen beolvasott adatokra a végrehajtás későbbi szakaszában.

3.2. Nélkül @NévEntityGraph

Vagy definiálhatunk egy ad-hoc entitásdiagramot is, val vel attributePaths.

Vegyünk fel egy ad-hoc entitásdiagramot az elemünkbe JellemzőkTár ami lelkesen tölti be Tétel szülő:

nyilvános felület A CharacteristicsRepository kiterjeszti a JpaRepository {@EntityGraph (attributePaths = {"item"}) karakterisztikus findByType (karakterlánc típusa); }

Ez betölti a tétel tulajdona Jellegzetes entitás lelkesen, annak ellenére, hogy szervezetünk lusta rakodási stratégiát hirdet erre a tulajdonságra.

Ez hasznos, mivel az entitásdiagramot inline-ban definiálhatjuk, ahelyett, hogy egy létező elnevezett entitásgráfra hivatkoznánk.

4. Teszteset

Most, hogy meghatároztuk az entitásgrafikonjainkat, hozzunk létre egy tesztesetet annak ellenőrzésére:

@DataJpaTest @RunWith (SpringRunner.class) @Sql (scripts = "/entitygraph-data.sql") public class EntityGraphIntegrationTest {@Autowired private ItemRepository itemRepo; @Autowired private CharacteristicsRepository featuresRepo; @Test public void givenEntityGraph_whenCalled_shouldRetrunDefinedFields () {Item item = itemRepo.findByName ("Táblázat"); assertThat (item.getId ()). isEqualTo (1L); } @Test public void givenAdhocEntityGraph_whenCalled_shouldRetrunDefinedFields () {Characteristic character = featuresRepo.findByType ("Rigid"); assertThat (jellemző.getId ()). isEqualTo (1L); }}

Az első teszt a @NévEntityGraph annotáció.

Lássuk a Hibernate által generált SQL-t:

válassza a item0_.id mint id1_10_0_, karakteri1__id mint id1_4_1_, item0_.name nevet2_10_0_, characteri1_.em_id mint item_id3_4_1_, characteri1_.type, mint type2_4_1_, karakteri1_.item_id, mint item_id3_4_0_____jellemző_ on item0_.id = characteri1_.item_id ahol item0_.name =?

Összehasonlításképpen távolítsuk el a @EntityGraph kommentár a tárból, és ellenőrizze a lekérdezést:

válassza a item0_.id elemet id1_10_, a item0_.name nevet2_10_ az item0_ elemből, ahol item0_.name =?

Ezekből a lekérdezésekből egyértelműen megfigyelhetjük, hogy a lekérdezés anélkül keletkezett @EntityGraph annotáció nem tölti be a Jellegzetes entitás. Ennek eredményeként csak a Tétel entitás.

Végül hasonlítsuk össze a második teszt hibernált lekérdezéseit a @EntityGraph kommentár:

válassza a characteri0_.id azonosítóként id1_4_0_, az item1_.id mint id1_10_1_, a karakteri0_.item_id elem_azonosító3_4_0_, a karakteri0_.type típus típusa2_4_0_, elem1_.név névként2_10_1_ a karakterisztikus karakterből0_ bal külső csatlakozási elem___ karakter_az_ karakter_az. karakter_az._ =?

És a lekérdezés a @EntityGraph kommentár:

válassza ki a characteri0_.id elemet id1_4_, a characteri0_.item_id elem_azonosító3_4_, karakteri0_.type -típust2_4_ a karakteri karakter0 közül, ahol karakteri0_.type =?

5. Következtetés

Ebben az oktatóanyagban megtanultuk a JPA entitásdiagramok használatát a tavaszi adatokban. A tavaszi adatokkal létrehozhatunk több repozíciós módszert, amelyek különböző entitásdiagramokhoz vannak kapcsolva.

A cikk példái a GitHub oldalon érhetők el.