Vodič za DeltaSpike podatkovni modul

1. Pregled

Apache DeltaSpike je projekt koji pruža a zbirka CDI ekstenzija za Java projekte; zahtijeva da CDI implementacija bude dostupna tijekom izvođenja.

Naravno, može raditi s različitim primjenama CDI-a - JBoss Weld ili OpenWebBeans. Također je testiran na mnogim aplikacijskim poslužiteljima.

U ovom uputstvu usredotočit ćemo se na jedan od najpoznatijih i najkorisnijih - podatkovni modul.

2. Postavljanje podatkovnog modula DeltaSpike

Apache DeltaSpike Data modul koristi se za pojednostaviti provedbu uzorka spremišta. Dopušta smanjenje šifre uzorka pružanjem centralizirane logike za stvaranje i izvršavanje upita.

Vrlo je sličan projektu Spring Data. Da bismo postavili upit za bazu podataka, moramo definirati deklaraciju metode (bez implementacije) koja slijedi definiranu konvenciju imenovanja ili koja sadrži @Query bilješka. Implementaciju će za nas obaviti proširenje CDI.

U sljedećim pododjeljcima opisat ćemo kako postaviti Apache DeltaSpike Data modul u našoj aplikaciji.

2.1. Potrebne ovisnosti

Da bismo koristili Apache DeltaSpike Data modul u aplikaciji, moramo postaviti potrebne ovisnosti.

Kada je Maven naš alat za izgradnju, moramo se koristiti:

 org.apache.deltaspike.modules deltaspike-data-module-api 1.8.2 kompajliranje org.apache.deltaspike.modules deltaspike-data-module-impl 1.8.2 runtime 

Kada koristimo Gradle:

vrijeme izvođenja 'org.apache.deltaspike.modules: deltaspike-data-module-impl' sastavi 'org.apache.deltaspike.modules: deltaspike-data-module-api' 

Artefakti Apache DeltaSpike Data modula dostupni su na Maven Central:

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

Do pokrenite aplikaciju s podatkovnim modulom, također nam trebaju JPA i CDI implementacije dostupne u vrijeme izvođenja.

Iako je moguće pokrenuti Apache DeltaSpike u aplikaciji Java SE, u većini slučajeva bit će raspoređen na aplikacijskom poslužitelju (npr. Wildfly ili WebSphere).

Aplikacijski poslužitelji imaju potpunu podršku za Jakarta EE, tako da ne moramo ništa više raditi. U slučaju aplikacije Java SE, moramo osigurati ove implementacije (npr. Dodavanjem ovisnosti u Hibernate i JBoss Weld).

Dalje ćemo također pokriti potrebnu konfiguraciju za EntityManager.

2.2. Konfiguracija upravitelja entiteta

The Podatkovni modul zahtijeva EntityManager za injekciju preko CDI.

To možemo postići pomoću CDI proizvođača:

javna klasa EntityManagerProducer {@PersistenceContext (unitName = "primary") private EntityManager entityManager; @ApplicationScoped @Produces public EntityManager getEntityManager () {return entityManager; }}

Gornji kod pretpostavlja da imamo jedinicu postojanosti s imenom primarni definirano u postojanost.xml datoteka.

Pogledajmo dolje kao primjer definicije:

 java: jboss / datasources / baeldung-jee7-seedDS 

Jedinica trajnosti u našem primjeru koristi tip transakcije JTA, što znači da moramo osigurati strategiju transakcija koju ćemo koristiti.

2.3. Strategija transakcija

U slučaju da za izvor podataka koristimo tip JTA transakcije, tada moramo definirati strategiju transakcija koja će se koristiti u spremištima Apache DeltaSpike. Možemo to iznutra apache-deltaspike.svojstva datoteka (pod META-INF imenik):

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

Postoje četiri vrste strategije transakcija koje možemo definirati:

  • BeanManagedUserTransactionStrategy
  • ResourceLocalTransactionStrategy
  • ContainerManagedTransactionStrategy
  • EnvironmentAwareTransactionStrategy

Svi oni provode org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy.

Ovo je bio zadnji dio konfiguracije potreban za naš podatkovni modul.

Zatim ćemo pokazati kako implementirati klase uzoraka spremišta.

3. Klase spremišta

Kada koristimo podatkovni modul Apache DeltaSpike bilo koja apstraktna klasa ili sučelje može postati spremište razred.

Sve što moramo učiniti je dadodaj an @ Repozitorijbilješka s forEntity atribut koji definira JPA entitet koji bi naše spremište trebalo obraditi:

@Entity javna klasa Korisnik {// ...} @Repository (forEntity = User.class) javno sučelje SimpleUserRepository {// ...}

ili sa apstraktnim razredom:

@Repository (forEntity = User.class) javna apstraktna klasa SimpleUserRepository {// ...} 

Podatkovni modul otkriva klase (ili sučelja) s takvom bilješkom i obrađivat će metode koje su unutra.

Postoji nekoliko mogućnosti za definiranje upita za izvršavanje. Uskoro ćemo pokriti u sljedećim odjeljcima.

4. Upit iz naziva metode

Prva mogućnost da definiranje upita je korištenje imena metode koje slijedi definiranu konvenciju imenovanja.

Izgleda kao u nastavku:

(Entitet | Izborno | Popis | Tok) (prefiks) (Svojstvo [Usporednik]) {Svojstvo operatora [Uporednik]} 

Dalje, usredotočit ćemo se na svaki dio ove definicije.

4.1. Tip povrata

The vrsta return uglavnom definira koliko objekata bi naš upit mogao vratiti. Ne možemo definirati jednu cjelinu kao povratnu vrijednost u slučaju da naš upit može dati više rezultata.

Sljedeća metoda izbacit će iznimku u slučaju da postoji više od jedne Korisnik s imenom:

javni sažetak Korisnik findByFirstName (String firstName);

Suprotno nije točno - povratnu vrijednost možemo definirati kao a Kolekcija iako će rezultat biti samo jedan entitet.

javna zbirka sažetaka findAnyByFirstName (niz ime);

Prefiks imena metode koji sugerira jednu vrijednost kao povratnu vrstu (npr., findAny) se potiskuje u slučaju da povratnu vrijednost definiramo kao Kolekcija.

Gornji upit vratit će sve Korisnici s imenom koje se podudara čak i prefiks imena metode sugerira nešto drugo.

Takve kombinacije (Kolekcija vrsta povratka i prefiks koji sugerira jedan povratak vrijednosti) treba izbjegavati jer kod postaje ne intuitivan i teško razumljiv.

Sljedeći odjeljak prikazuje više pojedinosti o prefiksu imena metode.

4.2. Prefiks za metodu upita

Prefiks definira radnju koju želimo izvršiti na spremištu. Najkorisnije je pronaći entitete koji odgovaraju zadanim kriterijima pretraživanja.

Postoje mnogi prefiksi za ovu radnju poput pronađiBy, findAny, pronađi sve. Detaljan popis potražite u službenoj Apache DeltaSpike dokumentaciji:

javni sažetak Korisnik findAnyByLastName (Niz lastName);

Međutim, postoje i drugi predlošci metoda koji se koriste za brojanje i uklanjanje entiteta. Možemo računati svi redovi u tablici:

javni sažetak int count ();

Također, ukloniti Postoji predložak metode koji možemo dodati u naše spremište:

ukloni javnu apstraktnu prazninu (Korisnički korisnik);

Podrška za countBy i uklonitiBy Prefiksi metoda bit će dodani u sljedećoj verziji Apache DeltaSpike 1.9.0.

Sljedeći odjeljak pokazuje kako upitima možemo dodati više atributa.

4.3. Upit s mnogo svojstava

U upitu možemo koristiti mnoga svojstva u kombinaciji s i operatora.

javna zbirka sažetaka findByFirstNameAndLastName (String firstName, String lastName); javna zbirka sažetaka findByFirstNameOrLastName (String firstName, String lastName); 

Možemo kombinirati onoliko svojstava koliko želimo. Dostupno je i pretraživanje ugniježđenih svojstava koje ćemo prikazati sljedeće.

4.4. Upit s ugniježđenim svojstvima

The upit također može koristiti ugniježđena svojstva.

U slijedećem primjeru Korisnik entitet ima svojstvo adrese tipa Adresa i Adresa entitet ima Grad svojstvo:

@ Entiteta javna klasa Adresa {private String city; // ...} @Entity javna klasa Korisnik {@OneToOne adresa privatne adrese; // ...} javna zbirka sažetaka findByAddress_city (niz grada);

4.5. Redoslijed u upitu

DeltaSpike nam to omogućuje definirati redoslijed kojim se rezultat treba vratiti. Možemo definirati i uzlazni i silazni redoslijed:

javni sažetak Popis findAllOrderByFirstNameAsc ();

Kao što je prije svega prikazano moramo dodati dio imenu metode koji sadrži ime svojstva po kojem želimo sortirati i kratki naziv za smjer narudžbe.

Mnogo narudžbi možemo kombinirati lako:

javni sažetak Popis findAllOrderByFirstNameAscLastNameDesc (); 

Zatim ćemo pokazati kako ograničiti veličinu rezultata upita.

4.6. Ograničite veličinu rezultata upita i paginaciju

Postoje slučajevi upotrebe kada iz cijelog rezultata želimo dohvatiti nekoliko prvih redaka. To je takozvano ograničenje upita. Također je jednostavno s podatkovnim modulom:

javna zbirka sažetaka findTop2OrderByFirstNameAsc (); javna zbirka sažetaka findFirst2OrderByFirstNameAsc ();

Prvi i vrh mogu se koristiti naizmjenično.

Tada možemo omogućiti paginaciju upita pružajući dva dodatna parametra: @FirstResult i @MaxResult:

javna zbirka sažetaka findAllOrderByFirstNameAsc (@FirstResult int start, @MaxResults int size);

Već smo definirali puno metoda u spremištu. Neki od njih su generički i treba ih definirati jednom te ih koristiti svako spremište.

Apache DeltaSpike nudi nekoliko osnovnih tipova koje možemo koristiti da bismo dobili puno metoda izvan okvira.

U sljedećem ćemo se dijelu usredotočiti na to kako to učiniti.

5. Osnovni tipovi spremišta

Do dobiti neke osnovne metode spremišta, naše spremište trebalo bi proširiti osnovni tip koji pruža Apache DeltaSpike. Postoje neki od njih poput EntityRepository, FullEntityRepository, itd .:

Javno sučelje @Repository UserRepository proširuje FullEntityRepository {// ...}

Ili pomoću apstraktne klase:

@Repository javna apstraktna klasa UserRepository proširuje AbstractEntityRepository {// ...} 

Gore navedena implementacija daje nam mnogo metoda bez pisanja dodatnih redaka koda, pa smo dobili ono što smo željeli - masovno smanjujemo šifru.

U slučaju da koristimo osnovni tip spremišta, nema potrebe za dodavanjem dodatnog forEntity pripisati vrijednost našem @ Repozitorij bilješka.

Kada koristimo apstraktne klase umjesto sučelja za naše spremišta, dobivamo dodatnu mogućnost za stvaranje prilagođenog upita.

Apstraktne osnovne klase spremišta, npr. Repozitorij AbstractEntity daje nam pristup poljima (putem gettera) ili uslužnim metodama pomoću kojih možemo stvoriti upit:

javni popis findByFirstName (String firstName) {return typedQuery ("select u from User u where u.firstName =? 1") .setParameter (1, firstName) .getResultList (); } 

U gornjem primjeru koristili smo a typedQuery korisna metoda za stvaranje prilagođene implementacije.

Posljednja mogućnost izrade upita je upotreba @Query napomena koju ćemo pokazati sljedeće.

6. @Query Bilješka

SQL upit za izvršavanje također se može definirati pomoću @Query bilješka. Vrlo je slično proljetnom rješenju. Moramo dodati napomenu metodi s SQL upitom kao vrijednošću.

Prema zadanim postavkama ovo je JPQL upit:

@Query ("select u from User u where u.firstName =? 1") javna zbirka sažetaka findUsersWithFirstName (String firstName); 

Kao u gornjem primjeru, parametre možemo lako proslijediti upitu putem indeksa.

U slučaju da želimo proslijediti upit putem izvornog SQL-a umjesto JPQL-a, moramo definirati dodatni atribut upita - isNative s pravom vrijednošću:

@Query (value = "select * from User where firstName =? 1", isNative = true) javna sažetak Zbirka findUsersWithFirstNameNative (String firstName);

7. Zaključak

U ovom smo članku pokrili osnovnu definiciju Apache DeltaSpikea i usredotočili smo se na uzbudljivi dio - podatkovni modul. Vrlo je sličan projektu Spring Data.

Istražili smo kako implementirati obrazac spremišta. Također smo predstavili tri mogućnosti kako definirati upit za izvršavanje.

Kao i uvijek, cjeloviti primjeri koda korišteni u ovom članku dostupni su na Githubu.


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