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.