Útmutató a DeltaSpike adatmodulhoz

1. Áttekintés

Az Apache DeltaSpike egy olyan projekt, amely a CDI kiterjesztések gyűjteménye Java projektekhez; megköveteli, hogy a CDI implementáció futás közben elérhető legyen.

Természetesen működhet a CDI különböző megvalósításával - JBoss Weld vagy OpenWebBeans. Számos alkalmazáskiszolgálón is tesztelik.

Ebben az oktatóanyagban a következőkre fogunk összpontosítani az egyik legismertebb és leghasznosabb - Adat modul.

2. DeltaSpike adatmodul beállítása

Az Apache DeltaSpike Data modul megszokta egyszerűsítse a tárház mintázatának megvalósítását. Megengedi csökkenteni a kazánlap kódot a lekérdezések létrehozásának és végrehajtásának központosított logikájával.

Nagyon hasonlít a Spring Data projekthez. Az adatbázis lekérdezéséhez meg kell határoznunk egy metódusdeklarációt (implementáció nélkül), amely követi a meghatározott elnevezési megállapodást, vagy amely tartalmazza @Lekérdezés annotáció. A megvalósítást a CDI kiterjesztés végzi el helyettünk.

A következő alfejezetekben az Apache DeltaSpike Data modul telepítésével foglalkozunk alkalmazásunkban.

2.1. Szükséges függőségek

Az Apache DeltaSpike Data modul használatához az alkalmazásban be kell állítanunk a szükséges függőségeket.

Amikor a Maven az építõeszközünk, akkor használnunk kell:

 org.apache.deltaspike.modules deltaspike-data-module-api 1.8.2 compile org.apache.deltaspike.modules deltaspike-data-module-impl 1.8.2 futásidejű 

Amikor a Gradle-t használjuk:

futásidejű 'org.apache.deltaspike.modules: deltaspike-data-module-impl' compile 'org.apache.deltaspike.modules: deltaspike-data-module-api' 

Az Apache DeltaSpike Data modul melléktermékei elérhetők a Maven Centralon:

  • deltaspike-data-module-impl
  • deltaspike-data-module-api

Nak nek futtasson egy alkalmazást a Data modullal, szükségünk van egy futás közben elérhető JPA és CDI megvalósításokra is.

Bár lehetséges az Apache DeltaSpike futtatása a Java SE alkalmazásban, a legtöbb esetben az alkalmazáskiszolgálón (pl. Wildfly vagy WebSphere) lesz telepítve.

Az alkalmazásszerverek teljes Jakarta EE támogatást nyújtanak, így nem kell többet tennünk. Java SE alkalmazás esetén ezeket a megvalósításokat kell biztosítanunk (például a Hibernate és a JBoss Weld függőségek hozzáadásával).

Ezután kitérünk a szükséges konfigurációra is EntityManager.

2.2. Entity Manager konfiguráció

A Az adatmodul megköveteli EntityManager beadni a CDI-re.

Ezt elérhetjük egy CDI-gyártó segítségével:

public class EntityManagerProducer {@PersistenceContext (unitName = "primary") private EntityManager entitásManager; @ApplicationScoped @Produces public EntityManager getEntityManager () {return entitManager; }}

A fenti kód feltételezi, hogy van perzisztencia egységünk névvel elsődleges meghatározta a kitartás.xml fájl.

Lássuk az alábbiakban a definíció példáját:

 java: jboss / datasources / baeldung-jee7-seedDS 

A példánkban szereplő állandó egység JTA tranzakciótípust használ, ami azt jelenti, hogy meg kell adnunk egy Tranzakciós Stratégiát, amelyet használni fogunk.

2.3. Tranzakciós stratégia

Abban az esetben, ha az adatforrásunkhoz JTA tranzakciótípust használunk, meg kell határoznunk az Apache DeltaSpike adattárakban használt tranzakciós stratégiát. Bent meg tudjuk csinálni apache-deltaspike.tulajdonságok fájl ( META-INF Könyvtár):

globalAlternatives.org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy = org.apache.deltaspike.jpa.impl.transaction.ContainerManagedTransactionStrategy

Négyféle tranzakciós stratégiát határozhatunk meg:

  • BeanManagedUserTransactionStrategy
  • ResourceLocalTransactionStrategy
  • ContainerManagedTransactionStrategy
  • EnvironmentAwareTransactionStrategy

Mindegyikük végrehajtja org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy.

Ez volt az adatmodulunkhoz szükséges konfiguráció utolsó része.

Ezután bemutatjuk, hogyan lehet megvalósítani a repository pattern osztályokat.

3. Adattár osztályok

Amikor az Apache DeltaSpike adatmodult használjuk bármely absztrakt osztály vagy interfész tárolóvá válhat osztály.

Csak annyit kell tennünkadj hozzá egy @Raktárannotáció val,-vel forEntity attribútum, amely meghatározza a JPA entitást, amelyet a tárunknak kezelnie kell:

@Entity public class Felhasználó {// ...} @Repository (forEntity = User.class) nyilvános felület SimpleUserRepository {// ...}

vagy egy absztrakt osztállyal:

@Repository (forEntity = User.class) nyilvános absztrakt osztály SimpleUserRepository {// ...} 

Az adatmodul felfedezi az osztályokat (vagy interfészeket) egy ilyen feljegyzéssel, és feldolgozza a benne lévő módszereket.

Kevés lehetőség van a végrehajtandó lekérdezés meghatározására. Röviden foglalkozunk röviden a következő szakaszokban.

4. Lekérdezés a módszer nevéből

Az első lehetőség A lekérdezés meghatározása a metódus nevének használata, amely egy meghatározott elnevezési szokást követ.

Az alábbiak szerint néz ki:

(Entitás | Opcionális | Lista | Patak) (előtag) (Tulajdonság [Összehasonlító]) ​​{Operátor tulajdonság [Összehasonlító]} 

Ezután a meghatározás egyes részeire összpontosítunk.

4.1. Return Type

A A return típus elsősorban azt határozza meg, hogy a lekérdezésünk hány objektumot adhat vissza. Nem határozhatunk meg egyetlen entitástípust visszatérési értékként, ha a lekérdezésünk több eredményt is eredményezhet.

A következő módszer kivételt vet ki, ha több is van Felhasználó keresztnévvel:

public abstract Felhasználó findByFirstName (String keresztnév);

Az ellenkezője nem igaz - a visszatérési értéket a-ként definiálhatjuk Gyűjtemény annak ellenére, hogy az eredmény csak egyetlen entitás lesz.

nyilvános absztrakt Gyűjtemény findAnyByFirstName (String keresztnév);

A metódusnév előtag, amely egy értéket javasol visszatérési típusként (pl. findAny) el van nyomva, ha a visszatérési értéket úgy definiáljuk Gyűjtemény.

A fenti lekérdezés az összeset visszaadja Felhasználók egy keresztnévvel még a metódus előtag is mást sugall.

Az ilyen kombinációk (Gyűjtemény kerülni kell, mivel a kód nem lesz intuitív és nehezen érthető.

A következő szakasz további részleteket mutat be a metódus előtagjával kapcsolatban.

4.2. A lekérdezési módszer előtagja

Az előtag határozza meg azt a műveletet, amelyet a táron akarunk végrehajtani. A leghasznosabb olyan entitásokat találni, amelyek megfelelnek a megadott keresési feltételeknek.

Ennek a műveletnek számos előtagja van, mint például findBy, findAny, Találd meg mindet. A részletes listát az Apache DeltaSpike hivatalos dokumentációjában találja:

public absztrakt Felhasználó findAnyByLastName (String vezetéknév);

Vannak azonban olyanok is egyéb metódus sablonok, amelyeket az entitások számlálására és eltávolítására használnak. Tudunk számol a táblázat összes sora:

public abstract int count ();

Is, eltávolítani létezik metódus sablon, amelyet hozzáadhatunk a tárunkba:

public abstract void remove (Felhasználói felhasználó);

Támogatás a countBy és removeBy A metódus előtagok az Apache DeltaSpike 1.9.0 következő verziójába kerülnek.

A következő szakasz bemutatja, hogyan adhatunk további attribútumokat a lekérdezésekhez.

4.3. Lekérdezés sok tulajdonsággal

A lekérdezésben használhatjuk sok tulajdonság kombinálva és üzemeltetők.

nyilvános absztrakt Gyűjtemény findByFirstNameAndLastName (String keresztnév, String vezetéknév); nyilvános absztrakt gyűjtemény findByFirstNameOrLastName (String keresztnév, String vezetéknév); 

Annyi tulajdonságot kombinálhatunk, amennyit csak akarunk. Beágyazott tulajdonságok keresése is elérhető, amelyeket a következő lépésben mutatunk be.

4.4. Lekérdezés beágyazott tulajdonságokkal

A a lekérdezés beágyazott tulajdonságokat is használhat.

A következő példában Felhasználó az entitás típusú cím tulajdonsággal rendelkezik Cím és Cím entitásnak van egy város ingatlan:

@Entity public class Cím {private String város; // ...} @Entity public class User {@OneToOne private Address address; // ...} nyilvános absztrakt Gyűjtemény findByAddress_city (String város);

4.5. Rendelés a Lekérdezésben

A DeltaSpike lehetővé teszi számunkra, hogy meghatározza az eredmény visszaküldésének sorrendjét. Meghatározhatjuk mind a növekvő, mind a csökkenő sorrendet:

nyilvános absztrakt ListAlAllOrderByFirstNameAsc ();

Mint mindenekelőtt látható meg kell tennünk, hogy hozzáadunk egy részt a metódus nevéhez, amely tartalmazza a rendezni kívánt tulajdonság nevet és a megrendelés irányának rövid nevét.

Számos megrendelést könnyen kombinálhatunk:

nyilvános absztrakt Lista findAllOrderByFirstNameAscLastNameDesc (); 

Ezután megmutatjuk, hogyan lehet korlátozni a lekérdezés eredményének méretét.

4.6. Korlátozza a lekérdezés eredményének méretét és az oldalszámozást

Vannak olyan felhasználási esetek, amikor néhány első sort szeretnénk lekérni a teljes eredményből. Ez az úgynevezett lekérdezési korlát. A Data modullal is egyszerű:

nyilvános absztrakt Gyűjtemény findTop2OrderByFirstNameAsc (); nyilvános absztrakt Gyűjtemény findFirst2OrderByFirstNameAsc ();

Első és tetejére felcserélhetően használható.

Akkor megtehetjük két további paraméter megadásával engedélyezze a lekérdezés oldalszámozását: @FirstResult és @MaxResult:

nyilvános absztrakt Gyűjtemény findAllOrderByFirstNameAsc (@FirstResult int start, @MaxResults int méret);

Nagyon sok módszert definiáltunk már a tárban. Némelyikük általános, és ezeket egyszer kell meghatározni, és minden tárolónak használniuk kell.

Az Apache DeltaSpike néhány alapvető típust kínál, amelyekkel sok módszert használhatunk a dobozon kívül.

A következő szakaszban erre összpontosítunk.

5. Az adattár alaptípusai

Nak nek szerezzünk be néhány alapvető lerakat-módszert, a tárunknak ki kell terjesztenie az Apache DeltaSpike által biztosított alapvető típust. Van köztük néhány EntityRepository, FullEntityRepository, stb.:

@Repository nyilvános felület A UserRepository kiterjeszti a FullEntityRepository {// ...}

Vagy egy absztrakt osztály használatával:

@Repository nyilvános absztrakt osztály A UserRepository kiterjeszti az AbstractEntityRepository {// ...} 

A fenti megvalósítás rengeteg módszert ad számunkra anélkül, hogy további kódsorokat írnánk, így megszereztük, amit akartunk - tömegesen csökkentjük a kazánlap kódját.

Ha alaptárhely-típust használunk, nincs szükség további átadásra forEntity értéket tulajdonítson a mi @Raktár annotáció.

Amikor absztrakt osztályokat használunk interfészek helyett a tárházainkhoz, további lehetőséget kapunk egy egyéni lekérdezés létrehozására.

Absztrakt alaptárhely-osztályok, pl. AbstractEntityRepository hozzáférést biztosít mezőkhöz (gettereken keresztül) vagy segédprogramokhoz, amelyeket felhasználhatunk egy lekérdezés létrehozására:

public List findByFirstName (String firstName) {return typedQuery ("u kiválasztása az u felhasználóból, ahol u.firstName =? 1") .setParameter (1, keresztnév) .getResultList (); } 

A fenti példában a typedQuery segédprogram módszer egyéni megvalósítás létrehozására.

A lekérdezés létrehozásának utolsó lehetősége a használat @Lekérdezés annotáció, amelyet legközelebb megmutatunk.

6. @Lekérdezés Megjegyzés

Az SQL a végrehajtandó lekérdezés a @Lekérdezés annotáció. Nagyon hasonlít a tavaszi megoldásra. Ki kell egészítenünk egy annotációt a módszerhez, amelynek értéke SQL lekérdezés.

Alapértelmezés szerint ez egy JPQL lekérdezés:

@Query ("u kiválasztása az u felhasználótól, ahol u.firstName =? 1") nyilvános absztrakt gyűjtemény findUsersWithFirstName (String keresztnév); 

A fenti példához hasonlóan, könnyen átadhatjuk a paramétereket egy indexen keresztül a lekérdezésnek.

Abban az esetben, ha a lekérdezést natív SQL-n keresztül szeretnénk átadni JPQL helyett, meg kell határoznunk további lekérdezési attribútumot - isNative valódi értékkel:

@Query (value = "select * from User where firstName =? 1", isNative = true) public absztrakt Gyűjtemény findUsersWithFirstNameNative (String keresztnév);

7. Következtetés

Ebben a cikkben az Apache DeltaSpike alapvető definíciójával foglalkoztunk, és az izgalmas részre - az adat modulra - összpontosítottunk. Nagyon hasonlít a Spring Data Projecthez.

Megvizsgáltuk, hogyan lehet megvalósítani az adattár mintáját. Három lehetőséget is bemutattunk a végrehajtandó lekérdezés definiálására.

Mint mindig, az ebben a cikkben használt teljes kódpéldák elérhetők a Github oldalon.